编辑布尔值和运算符

Den*_*nis 4 python boolean operators

所以我一直在搞乱类中的标准运算符,试着看看我能做些什么,但我还是找不到如何编辑布尔and运算符.

我可以&通过定义__and__(self)而不是and行为的方式来编辑按位运算符.有谁知道我怎么能改变我a and b所在班级的实例a和行为b

提前致谢!

int*_*ser 5

and运算符使用 将第一个操作数转换为布尔值__bool__,然后对布尔值执行预定义的操作(如果first.__bool__()True,则返回第二个,否则返回第一个)。没有办法改变这种行为。


tim*_*geb 5

在Python 2,andor访问__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)