asm*_*rer 14 python inequality equality operator-overloading
根据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
Run Code Online (Sandbox Code Playgroud)
那么定义__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
Run Code Online (Sandbox Code Playgroud)
但我引用的文档是Python 3文档.他们只是没有更新?
Mar*_*ers 16
Python 3改变了==案例的行为,参见Python 3,新功能:
!=现在返回相反的==,除非==返回NotImplemented.
它被认为是一个有用的变化.
文档尚未更新的事实确实是一个长期存在的错误.
但是,正如对报告的评论指出的那样,如果从已经定义的类继承__ne__,则覆盖仅仅__eq__是不够的,并且您还必须覆盖该__ne__方法.
| 归档时间: |
|
| 查看次数: |
463 次 |
| 最近记录: |