Skip to main content
 首页 » 编程设计

python之如何使 Python 对象在相等性测试中始终返回 true

2025年05月04日11落叶无声

编辑:下面的代码有一个简单的错误,实际上并没有说明问题。我把它留在这里(未更正),但我仍然对底部问题的答案感到好奇。

我在 Python 中有以下对象,它应该总是为相等性测试返回 true:

class Wildcard(object): 
    def __eq__(self, other): 
        return True 

它在某些情况下有效,但并非全部:

>>> w = Wildcard() 
>>> w == 'g' 
True 
>>> 'g' == w 
True 
>>> w == 10 
True 
>>> 10 == 'w' 
False 

据我了解,== 运算符将第二个操作数传递给第一个操作数的 __eq__ 方法,这解释了为什么 w == 10 有效而 10 == w 无效。这就提出了两个问题。首先,是否可以构造具有此属性的对象,而不管它是哪个操作数?其次,为什么这适用于字符串,而不适用于 int? String 的 __ eq__ 方法如何使它评估 'g' == w 为 True?

请您参考如下方法:

不幸的是,没有办法(据我所知)构造这样一个对象。考虑:

>>> class Wildcard(object): 
...     def __eq__(self, other): 
...         return True 
...  
>>> w = Wildcard() 
>>> w == 10 
True 
>>> 10 == w 
True 
>>> class Joker(object): 
...     def __eq__(self, other): 
...         return False 
...  
>>> j = Joker() 
>>> w == j 
True 
>>> j == w 
False 

w(一个通配符)没有理由优先于j(一个Joker)在这种情况下。


现在,您可能想知道为什么这对字符串和整数有效——这是因为如果类的测试返回单例 NotImplemented,那么测试会从第一个参数委托(delegate)给第二个参数:

>>> class Foo(object): 
...     def __eq__(self, other): 
...         if isinstance(other, Wildcard): 
...             return NotImplemented 
...         else: 
...             return False 
...  
>>> f = Foo() 
>>>  
>>> f == 1 
False 
>>> f == Foo() 
False 
>>> f == w 
True