为什么Python文档说我在定义__eq__时需要定义__ne__?

时间:2014-06-27 15:23:37

标签: python operator-overloading equality inequality

根据Python docs:"定义__eq__()时,还应定义__ne__(),以便运算符按预期运行"。

但是,Python似乎会自动将__ne__计算为not __eq__

In [8]: class Test:
    def __eq__(self, other):
        print("calling __eq__")
   ...:         return isinstance(other, Test)
   ...:

In [9]: a = Test()

In [10]: b = Test()

In [11]: a == b
calling __eq__
Out[11]: True

In [12]: a != b
calling __eq__
Out[12]: False

In [13]: a == 1
calling __eq__
Out[13]: False

In [14]: a != 1
calling __eq__
Out[14]: True

那么定义__ne__它是否恰好是return not self.__eq__(other)的重点是什么?此外,这种行为实际记录在哪里?

修改

显然我使用Python 3很重要。在Python 2中,我得到了

In [1]: class Test(object):
   ...:     def __eq__(self, other):
   ...:         print("calling __eq__")
   ...:         return isinstance(other, Test)
   ...:

In [2]: a = Test()

In [3]: b = Test()

In [4]: a == b
calling __eq__
Out[4]: True

In [5]: a != b
Out[5]: True

In [6]: a == 1
calling __eq__
Out[6]: False

In [7]: a != 1
Out[7]: True

但我引用的文档是Python 3文档。他们只是没有更新?

1 个答案:

答案 0 :(得分:16)

Python 3更改了==案例的行为,请参阅Python 3, What's New

  

!=现在返回==的反面,除非==返回NotImplemented

它被视为a useful change

文档尚未更新的事实确实是long standing bug

然而,正如对报告的评论指出的那样,如果您从已定义__ne__的类继承,则仅覆盖__eq__是不够的,而且您#&# 39; ll还必须覆盖__ne__方法。