该and运算符使用 将第一个操作数转换为布尔值__bool__,然后对布尔值执行预定义的操作(如果first.__bool__()是True,则返回第二个,否则返回第一个)。没有办法改变这种行为。
在Python 2,and和or访问__nonzero__:
>>> class Test(object):
... def __nonzero__(self):
... print '__nonzero__ called'
... return True
...
>>> Test() and 1
__nonzero__ called
1
Run Code Online (Sandbox Code Playgroud)
在Python 3中,__nonzero__已重命名为__bool__.
>>> class Test:
... def __bool__(self):
... print('__bool__ called')
... return True
...
>>> Test() and 1
__bool__ called
1
Run Code Online (Sandbox Code Playgroud)
请注意,短路评估可能会抑制对__nonzero__或的呼叫__bool__.
>>> 0 and Test()
0
>>> 1 or Test()
1
Run Code Online (Sandbox Code Playgroud)
要注意的另一个特性是Python正在尝试访问__len__if __nonzero__/ __bool__not defined并将该对象视为truthy,如果__len__返回的值不是0.如果定义了两种方法,则__nonzero__/ __bool__wins.
>>> 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 0x7fc18b5e26d8> # evaluation stops at Test() because the object is falsy
>>> bool(Test())
False
Run Code Online (Sandbox Code Playgroud)
有什么方法可以让这个回归除了布尔之外的其他东西,比如说,一个布尔列表?
很不幸的是,不行.该文件指出,该方法应该返回False或者True其实你得到一个TypeError,如果你让它返回别的东西.
>>> class Test:
... def __bool__(self):
... return 1
...
>>> Test() and 42
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: __bool__ should return bool, returned int
>>>
>>> bool(Test())
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: __bool__ should return bool, returned int
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
104 次 |
| 最近记录: |