14

根据Python 文档:“在定义时__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 文档。他们只是没有更新吗?

4

1 回答 1

16

Python 3 更改了该==案例的行为,请参阅Python 3,新增功能

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

它被认为是一个有用的改变

文档没有更新的事实确实是一个长期存在的错误

但是,正如对报告的评论指出的那样,如果您从已经定义的类继承__ne__,仅覆盖__eq__是不够的,您还必须覆盖该__ne__方法。

于 2014-06-27T15:55:30.993 回答