我最近开始阅读 The Python Language Reference, Release 2.7.10 。
在 第3.4节:特殊方法名称 中,特别是关于比较运算符object.__eq__(self, other)
和object.__ne__(self, other)
,它指出以下内容导致了一些混乱:
比较运算符之间没有隐含的关系。 x == y的真实性并不意味着x!= y为假 。因此,在定义 eq ()时,还应该定义 ne (),以便运算符按预期运行。
这句话究竟是什么意思? x==y
的真实性如何不能自动且毫无疑问地转化为x!=y
的错误值?
答案 0 :(得分:3)
“没有隐含的关系”意味着当您使用“!=”时,如果您尚未实现__ne__
,则不会调用__eq__
并取消结果。它将使用从其父级继承的__ne__
方法。大多数情况下,这将解析为object.__ne__
,它仅检查引用相等性。
>>> class Fred:
... def __eq__(self, other):
... print "eq was called!"
... return False
...
>>> x = Fred()
>>> print x == 23
eq was called!
False
>>> #if eq and ne had an implied relationship,
>>> #we'd expect this next line to also print "eq was called!"
>>> print x != 23
True
>>> #... but it doesn't.
这也意味着您可以以似乎在数学上相互矛盾的方式自由定义__eq__
和__ne__
。 Python不会牵你的手。
>>> class Fred:
... def __eq__(self, other):
... return True
... def __ne__(self, other):
... return True
...
>>> x = Fred()
>>> print x == 23
True
>>> print x != 23
True
虽然它确实暗示你应该以数学上合理的方式实现它们。上面的代码块是合法的,但不明智。
答案 1 :(得分:1)
这是一个人为的例子,展示了解耦这两者的一种可能用法。
class Z7(object):
def __init__(self, x):
self.x = x
def __eq__(self, other):
return self.x == other.x
def __ne__(self, other):
return self.x % 7 != other.x % 7
这使我们可以在两个对象之间进行三向区分:完全相等的数字(==
返回True
),数字等于模7({ {1}} 和 ==
返回!=
),数量不等于模7(False
返回!=
)。
True
这不使用第四种可能性,其中if x == y:
# E.g. Z7(3) == Z7(3)
print("x and y are identical)"
elif x != y:
# E.g. Z7(3) != Z7(5)
print("x and y are unalike")
else:
# Neither are true, so thy must be similar
# E.g. Z7(3) and Z7(10)
print("x and y are similar")
和==
都返回!=
,这是我认为不能很好用的。