编辑:以下代码有一个简单的错误,实际上没有说明问题。我把它留在这里(未经修正),但我仍然对底部问题的答案感到好奇。
我在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?
答案 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
在此方案中,w
(Wildcard
)没有理由优先于j
(Joker
)。
现在,您可能想知道为什么这适用于字符串和整数 - 这是因为如果类的测试返回单例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