为什么不像天真的预期那样起作用?
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
)
Answers:
为了与Python 2-3兼容,只需将其添加到示例中:
Foo.__nonzero__ = Foo.__bool__
或将Foo的原始定义扩展为包括:
__nonzero__ = __bool__
当然,您也可以反向定义它们,方法名称在哪里,__nonzero__
然后将其分配给__bool__
,但是我认为该名称__nonzero__
只是Python根据其与对象的等价性将对象解释为真或假的原始C-ishness的遗产。零。只需添加上面的语句,您的代码即可在Python 2.x上运行,并且在升级到Python 3.x时会自动运行(最终您将工作分配到__nonzero__
)。
因为对应的特殊方法是__nonzero__()
在Python 2中调用的,因此要__bool__()
等到Python 3之后才能调用。
return self.bar > 10
紧缩(0个空格),第二个可以在行前def __init__(self):
紧缩(4个空格)。那是对的吗?或将第二个必须去后的__bool__
定义是什么?