覆盖内置“和”

时间:2011-03-28 00:32:22

标签: python override

原始的“和”可以被覆盖吗? 例如,如果我尝试做这样的事情

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

3 个答案:

答案 0 :(得分:7)

__and__会覆盖按位运算符&,而不是逻辑运算符。

要为您的类布尔逻辑处理,请定义__nonzero__方法:http://docs.python.org/reference/datamodel.html#object.__nonzero__

答案 1 :(得分:2)

and运算符无法被覆盖,因为它并不总是评估它的两个操作数。没有办法提供可以执行其操作的函数,在调用函数之前,函数的参数总是被完全评估。 or也是如此。

答案 2 :(得分:1)

在Python中无法覆盖布尔andor。确实,它们具有特殊的行为(短路,因此并不总是评估两个操作数),这与它们不可重写的原因有关。然而,这不是(恕我直言)的全部故事。

事实上,Python 可以提供支持短路的工具,同时仍然允许覆盖andor运算符;它根本不这样做。这可能是一个谨慎的选择,以保持简单,或者可能是因为Python开发人员认为对开发人员更有用的其他东西,而是正在开发它们。

但是,它是Python设计者的选择,而不是自然法则。