2011-03-28 61 views
3

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

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 

回答

2

and操作不能被重写,因为它并不总是评估它的两个操作数。没有办法提供一个可以完成它的功能的函数,函数的参数总是在函数调用之前完全评估。 or也是如此。

+0

你能否给我一个两个操作数都没有被评估的情况?我想不出一个。 – Doboy 2011-03-28 02:47:16

+1

'x = False和foo()'。如果你写'foo()'包含一个'print'语句,你可以很容易地看到它永远不会被调用。如果其中一个操作数为假,那么布尔''和'永远不会成立,所以如果'和'知道第一个操作数是'假',它就不会评估第二个操作数。 '或'是另一种方式:如果第一个操作数是“真”,则不需要评估第二个操作数。这就是所谓的短路,它的副作用有时也是为了他们自己的缘故:例如,如果arg是空的,则arg = arg或default将赋值arg为空,或“无”。 – kindall 2011-03-28 02:52:32

1

布尔型andor不能在Python中重写。确实,他们有特殊的行为(短路,使得两个操作数不总是被评估),这与它们为什么不能被覆盖有关。然而,这不是(恕我直言)整个故事。

事实上,巨蟒可以提供支持短路,同时仍允许andor运营商覆盖的设施;它根本不这样做。这可能是故意选择简单的事情,或者可能是因为Python开发人员认为其他的东西会对开发人员更有用,并且正在开发他们。

但是,这是Python设计师的一个选择,而不是自然规律。