原始的“and”能被覆盖吗?例如,如果我尝试像这样做:
class foo():
def __and__(self,other):
return "bar"
这将被输出
>> foo() and 4
4
>> foo().__and__(4)
'bar'
我的直觉是内置的功能不能被覆盖,也不应该被覆盖以避免混淆。
我认为 and 函数不应该被更改,因为它不需要更改,因为它的行为就像
def and(self,other):
if( not bool(self) ):
return self
else:
return other
foo()
中包含一个print
语句,你可以很容易地看到它从未被调用。如果and
知道第一个操作数是False
,那么布尔and
永远不可能为真,因此它不会评估第二个操作数。or
则相反:如果第一个操作数为True
,则无需评估第二个操作数。这被称为短路,其副作用有时会出于自己的目的而使用:例如,arg = arg or default
将在arg
为空、零或None
时将值default
分配给arg
。 - kindall