【问题标题】:In Python, what operator to override for "if object:"?在 Python 中,要为“if object:”覆盖什么运算符?
【发布时间】:2011-07-14 10:10:57
【问题描述】:

我发现使用以下构造检查对象是否为“空”非常方便:

l=[]
if l:
     do_stuff()

对于标准的python列表,if只有在列表不为空时才会被执行。

我的问题是,我怎样才能为自己的对象实现相同的想法?

【问题讨论】:

    标签: python object operator-overloading


    【解决方案1】:

    定义一个方法__bool__ (Python 3.x) 或__nonzero__ (2.x)。或者为可移植性定义两者,其中一个返回另一个的结果。

    【讨论】:

    • 谢谢!两者有区别吗?
    • 我相信__bool__ 是后来添加的。它们应该执行相同的操作,定义两者,其中一个调用另一个应该是安全的。
    • __nonzero__ 是 Python 2.x,__bool__ 是 Python 3.x。
    • @delnan:我以为他们将 __bool__ 反向移植到 2.6,但显然我错了。
    • 确实,更改记录在这里:docs.python.org/release/3.0.1/whatsnew/3.0.html。我猜__bool__ 对于非集合类型更有意义。
    【解决方案2】:

    为 Python 2 实现 __nonzero__,为 Python 3 实现 __bool__

    class AlwaysTrueObject:
        def __bool__(self):
            return True
        __nonzero__ = __bool__
    

    【讨论】:

    • __nonzero__ = __bool__ 效果一样。
    【解决方案3】:

    如果你实现了__len__,Python 会为你做这件事,假设长度为 0 意味着对象的布尔值是 False,否则它的布尔值是 True

    如果实现__len__ 没有意义,您可以实现__nonzero__(或3.x 中的__bool__(只是名称已更改)),它应该返回TrueFalse取决于对象的布尔值。

    【讨论】:

    • 感谢您的回答。我同意如果 len 已经存在并且可以解决问题,那么实现 bool 是没有意义的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-14
    • 1970-01-01
    • 2017-06-23
    • 2011-01-14
    • 1970-01-01
    相关资源
    最近更新 更多