Python中对象的布尔值
大家都知道,Python 有布尔值的概念。简单来说,如果一个类里面有一个叫做 __len__
的方法,那么这个类的实例如果调用 __len__()
返回 0,就会被认为是布尔值 False
(比如说,一个空列表就是这样的)。
实际上,任何可迭代的空对象在布尔表达式中出现时,都会被评估为 False
。
现在假设我有一个叫做 foo
的类,它有一个属性 bar
。我该如何定义它的真值呢?比如说,当 bar % 2 == 0
时,它的值应该是 True
,否则就是 False
。
举个例子:
myfoo = foo()
myfoo.bar = 3
def a(foo):
if foo:
print "spam"
else:
print "eggs"
所以,调用 a(myfoo)
应该打印出 "eggs"
。
如果你有关于 调试错误 的问题,特别是因为在 2.x 中使用了 3.x 特有的方法导致的错误,可以参考这个链接:如何在 2.x 中为类实现布尔值转换?为什么 "__bool__" 魔法方法不起作用?。
2 个回答
59
Python 2.x
使用 __nonzero__
这个特殊的方法。当你在布尔上下文中使用一个对象时,Python会自动调用这个方法。这个方法需要返回一个布尔值,也就是“真”或“假”,这个值会被用来进行判断。
例如:
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 !"
Python 3.x
在Python 3.x中,使用 __bool__
方法,方法的使用方式和Python 2.x是一样的。
38
在Python 2中,使用 __nonzero__
:
可以查看Python 2的文档了解更多关于 __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()