为什么这不是天真的预期?
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
)
答案 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__()
。