2011-03-28 97 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設計師的一個選擇,而不是自然規律。