如何使Python对象始终返回true以进行相等性测试?

时间:2014-05-01 03:20:33

标签: python object equality

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

我在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?

1 个答案:

答案 0 :(得分:8)

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

>>> 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

在此方案中,wWildcard)没有理由优先于jJoker)。


现在,您可能想知道为什么这适用于字符串和整数 - 这是因为如果类的测试返回单例NotImplemented,那么测试将从第一个参数委托给第二个参数:

>>> 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