在python中定义类的“boolness”

时间:2011-11-20 23:09:25

标签: python class boolean python-2.x

为什么这不是天真的预期?

class Foo(object):
    def __init__(self):
        self.bar = 3
    def __bool__(self):
        return self.bar > 10

foo = Foo()

if foo:
    print 'x'
else:
    print 'y'

(输出为x

3 个答案:

答案 0 :(得分:67)

对于Python 2-3兼容性,只需将其添加到您的示例中:

Foo.__nonzero__ = Foo.__bool__

或扩展Foo的原始定义以包括:

__nonzero__ = __bool__

你当然可以反过来定义它们,方法名称是__nonzero__,你将它分配给__bool__,但我认为名称__nonzero__只是遗产Python的原始C-ishness基于它们与零的等价性将对象解释为真实或虚假。只需添加上面的语句,您的代码将与Python 2.x一起使用,并在升级到Python 3.x时自动工作(最终您将作业放到__nonzero__)。

答案 1 :(得分:54)

在Python 3中使用__bool__方法。对于Python 2,您需要__nonzero__

答案 2 :(得分:24)

因为相应的特殊方法在Python 2中称为__nonzero__(),而在Python 3之前不是__bool__()