2015-12-31 30 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

不,你不能那样做。左手操作数总是首先尝试。如果它处理操作,则右侧操作数永远不会有机会做任何事情。