比较运营商之间没有隐含的关系

时间:2015-09-30 17:16:21

标签: python python-2.7

我最近开始阅读 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的错误值?

2 个答案:

答案 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") ==都返回!=,这是我认为不能很好用的。