为什么Python文档说定义__eq__时需要定义__ne__?
根据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__
方法。