2015-12-31 34 views
2
>>> class Yeah(object): 
...  def __eq__(self, other): 
...   return True 
...  
>>> class Nah(object): 
...  def __eq__(self, other): 
...   return False 
...  
>>> y = Yeah() 
>>> n = Nah() 
>>> y == n 
True 
>>> n == y 
False 

左傢伙勝出,因爲當python2看到x == y它試圖x.__eq__(y)先過比較豐富的運營商更多的控制。獲得在python2

有什麼辦法可以修改Nah這樣他就會贏得兩次?

我的用例正在是這樣的:

class EqualsAnyDatetime(object): 
    def __eq__(self, other): 
     return isinstance(other, datetime) 

這只是工作在python3因爲real_datetime.__eq__(random_other_thing)提高NotImplemented,讓對方在比較了一槍。在python2我似乎無法得到這個想法的工作。

+0

實際上,平等應該是對稱的。 –

+0

當然應該。這就是爲什麼我想'any_datetime = EqualsAnyDatetime()'在雙方工作,而不僅僅是左側工作。 – wim

+0

@wim你是否需要'Nah'中的'__eq__',如果不是,那麼從'Nah'中刪除''y == n'和'n == y'中的函數。 – nu11p01n73R

回答

1

我找到了一種方法,可以讓右手邊有機會說「我第一次」。訣竅是繼承你想強化比較的類型。

實施例:

>>> from datetime import datetime 
>>> class EqualsAnyDatetime(datetime): 
...  def __eq__(self, other): 
...   return isinstance(other, datetime) 
...  
>>> now = datetime.now() 
>>> any_datetime = EqualsAnyDatetime(1970, 1, 1) 
>>> now == any_datetime 
True 
>>> any_datetime == now 
True 
>>> now.__eq__(any_datetime) 
False 
1

不,你不能那樣做。左手操作數總是首先嚐試。如果它處理操作,則右側操作數永遠不會有機會做任何事情。