采用以下示例:
>>> class C(object):
... def __init__(self, p):
... self.p = p
... def __eq__(self, o):
... return True
...
>>> C(1) is C(2)
False
>>> C(1) == C(2)
True
>>> C(1) != C(2)
True # <- Why?!?
所以现在两个对象同时相等而不相等。我虽然这两个行动是对立的?!
答案 0 :(得分:27)
Python的“Data model”解释了这一切:
比较运营商之间没有隐含的关系。
x==y
的真相并不意味着x!=y
是错误的。因此,在定义__eq__()
时,还应定义__ne__()
,以便运算符按预期运行。
在C(1) != C(2)
中,它使用默认实现,其中对象仅与自身相等,并且与其他所有内容不相等。
定义__cmp__
可以更简单,因为它被用作所有比较操作的后备,而不仅仅是其中一些:
... def __cmp__(self, o):
... return 0
>>> C(1) != C(2)
False
答案 1 :(得分:8)
!=
有一个单独的函数__ne__
,它被隐式定义以比较实例成员。
您想要做的是:
def __ne__(self, other):
return not self.__eq__(other)
或其中的一些变体。
答案 2 :(得分:2)
您必须同时定义__ne__
和__eq__
。你可能也应该考虑实施__cmp__
!