原始的“和”可以被覆盖吗? 例如,如果我尝试做这样的事情
class foo():
def __and__(self,other):
return "bar"
这会输出
>> foo() and 4
4
>> foo().__and__(4)
'bar'
我的直觉是内置并且不能被覆盖,不应该被覆盖以免造成混淆。
我认为不应该更改和函数,因为它不需要,因为它的行为类似于
def and(self,other):
if( not bool(self) ):
return self
else:
return other
答案 0 :(得分:7)
__and__
会覆盖按位运算符&
,而不是逻辑运算符。
要为您的类布尔逻辑处理,请定义__nonzero__
方法:http://docs.python.org/reference/datamodel.html#object.__nonzero__
答案 1 :(得分:2)
and
运算符无法被覆盖,因为它并不总是评估它的两个操作数。没有办法提供可以执行其操作的函数,在调用函数之前,函数的参数总是被完全评估。 or
也是如此。
答案 2 :(得分:1)
在Python中无法覆盖布尔and
和or
。确实,它们具有特殊的行为(短路,因此并不总是评估两个操作数),这与它们不可重写的原因有关。然而,这不是(恕我直言)的全部故事。
事实上,Python 可以提供支持短路的工具,同时仍然允许覆盖and
和or
运算符;它根本不这样做。这可能是一个谨慎的选择,以保持简单,或者可能是因为Python开发人员认为对开发人员更有用的其他东西,而是正在开发它们。
但是,它是Python设计者的选择,而不是自然法则。