覆盖内置的 "and" 关键字

3

原始的“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
3个回答

7

2

and运算符无法被覆盖,因为它不总是评估其两个操作数。没有办法提供一个函数来执行它的功能,函数参数在调用函数之前总是被完全评估。同样适用于or


你能给我一个例子,其中两个操作数都不被评估吗?我想不出来。 - Doboy
1
x = False and foo()。如果你在foo()中包含一个print语句,你可以很容易地看到它从未被调用。如果and知道第一个操作数是False,那么布尔and永远不可能为真,因此它不会评估第二个操作数。or则相反:如果第一个操作数为True,则无需评估第二个操作数。这被称为短路,其副作用有时会出于自己的目的而使用:例如,arg = arg or default将在arg为空、零或None时将值default分配给arg - kindall

1

在Python中,布尔运算符andor不能被重载。它们有特殊的行为(短路行为,即不总是对两个操作数进行求值),这就是它们不能被重载的原因之一。然而,这并不是全部原因(在我看来)。

实际上,Python可以提供一种支持短路行为的机制,同时仍允许重载andor运算符;它只是没有这样做。这可能是出于保持简单性的故意选择,也可能是因为Python开发人员认为有其他更有用的东西,并正在开发它们。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接