Python中对象的布尔值

oob*_*boo 34 python boolean

我们知道,Python有对象的布尔值:如果一个类有一个__len__方法,它的每个实例__len__()都会返回0,它将被计算为一个布尔值False(例如,空列表).

实际上,每个可迭代的空自定义对象都被评估为False好像它出现在布尔表达式中.

现在假设我有一个foo属性类bar.我怎样才能定义它的真值,以便它会被评估True if bar % 2 == 0,False否则呢?

例如:

myfoo = foo()
myfoo.bar = 3
def a(myfoo):
    if foo:
        print "spam"
    else:
        print "eggs"
Run Code Online (Sandbox Code Playgroud)

所以,a(myfoo)应该打印"eggs".

e-s*_*tis 45

在Python <3.0:

你必须用来__nonzero__实现你想要的.这是在评估布尔上下文中的对象时由Python自动调用的方法.它必须返回一个布尔值,该布尔值将用作要评估的值.

EG:

class Foo(object):

    def __init__(self, bar) :
        self.bar = bar

    def __nonzero__(self) :
        return self.bar % 2 == 0

if __name__ == "__main__":
     if (Foo(2)) : print "yess !"
Run Code Online (Sandbox Code Playgroud)

在Python => 3.0中:

同样的事情,除了方法已经被重命名为更加明显__bool__.

  • `__nonzero__`在Python> = 3.0中也能正常工作吗? (5认同)
  • @Wolf,不,不会. (2认同)

sun*_*ang 39

请参阅Python文档__nonzero__.

class foo(object):
    def __nonzero__( self) :
        return self.bar % 2 == 0

def a(foo):
    if foo:
        print "spam"
    else:
        print "eggs"

def main():
    myfoo = foo()
    myfoo.bar = 3
    a(myfoo)

if __name__ == "__main__":
    main()
Run Code Online (Sandbox Code Playgroud)

  • 请参阅Python 3的其他答案,该答案仅适用于Python 2。 (3认同)