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

14 投票
1 回答
771 浏览
提问于 2025-04-18 11:20

根据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的文档。难道它们没有更新吗?

1 个回答

16

Python 3 对于 == 的行为进行了改变,具体可以查看 Python 3 的更新内容

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

这个改变被认为是 一个有用的改进

不过,文档没有更新确实是一个 长期存在的问题

但是,正如报告中的评论所指出的,如果你从一个已经定义了 __ne__ 方法的类继承,仅仅重写 __eq__ 方法是不够的,你还需要重写 __ne__ 方法。

撰写回答