正如我们所知,Python具有对象的布尔值:如果一个类有__len__
方法,那么__len__()
碰巧返回0的每个实例都将被计算为布尔值{{1 (例如,空列表)。
实际上,如果它出现在布尔表达式中,则每个可迭代的自定义对象都将被计算为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"
应该打印a(myfoo)
。
答案 0 :(得分:41)
在Python< 3.0:
您必须使用__nonzero__
来实现您的目标。这是在评估布尔上下文中的对象时由Python自动调用的方法。它必须返回一个布尔值,用作要评估的值。
E.G:
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.0:
同样的事情,除了方法已被重命名为更明显的__bool__
。
答案 1 :(得分:36)
请参阅__nonzero__
的Python文档。
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()