在
Python 2中,和/或访问__nonzero__:
>>> class Test(object):
... def __nonzero__(self):
... print '__nonzero__ called'
... return True
...
>>> Test() and 1
__nonzero__ called
1
在Python 3中,__ nonzero__已重命名为__bool__.
>>> class Test:
... def __bool__(self):
... print('__bool__ called')
... return True
...
>>> Test() and 1
__bool__ called
1
请注意,短路评估可能会抑制对__nonzero__或__bool__的调用.
>>> 0 and Test()
0
>>> 1 or Test()
1
要注意的另一个特性是,如果没有定义__nonzero__ / __bool__,Python正在尝试访问__len__,如果__len__返回0以外的值,则将对象视为真实.如果定义了两个方法,则__nonzero__ / __bool__获胜.
>>> class Test:
... def __len__(self):
... return 23
...
>>> Test() and True
True
>>>
>>> class Test:
... def __len__(self):
... return 23
... def __bool__(self):
... return False
...
>>> Test() and True
<__main__.test object at> # evaluation stops at Test() because the object is falsy
>>> bool(Test())
False
Is there any way i can have this return something other than a bool, like, say, a list of bools?
很不幸的是,不行. documentation声明该方法应返回False或True,但实际上如果让它返回其他内容,则会得到TypeError.
>>> class Test:
... def __bool__(self):
... return 1
...
>>> Test() and 42
Traceback (most recent call last):
File "", line 1, in
TypeError: __bool__ should return bool, returned int
>>>
>>> bool(Test())
Traceback (most recent call last):
File "", line 1, in
TypeError: __bool__ should return bool, returned int