为什么Python文档在定义eq时说我需要定义ne?
根据“定义为什么Python文档在定义eq时说我需要定义ne?,python,operator-overloading,equality,inequality,Python,Operator Overloading,Equality,Inequality,根据“定义\uuuu eq\uuuu()时,还应定义\uuu ne\uuuuuu(),以使操作符的行为符合预期” 但是,Python似乎会自动将计算为而不是
\uuuu eq\uuuu()
时,还应定义\uuu ne\uuuuuu()
,以使操作符的行为符合预期”
但是,Python似乎会自动将计算为而不是
:
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
那么定义\uuu ne\uuu
的意义是什么?如果它只是返回非自我?此外,这种行为在哪里有记录
编辑
显然,我在使用Python3很重要。在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文档。它们只是没有更新吗?Python 3改变了=
案例的行为,请参见:
=
现在返回与==
相反的值,除非==
返回未实现
它被视为
文件没有更新这一事实确实令人担忧
然而,正如对报告的评论所指出的那样,如果您继承的类已经定义了\uu______________
,仅覆盖\u_eq__
是不够的,您还必须覆盖\uu______
方法。作为猜测(因此不是答案),您可能需要定义一些东西,例如Rect()==Square()#True
,Square()==Rect()#False
,这就是为什么他们建议您定义这两个“以便运算符按预期运行”的原因。据我所知,这两个方法是独立的,重写其中一个并不意味着重写另一个。@oleg请参阅我的顶部示例。至少在Python 3中,重写\uuuuuu eq\uuuuu
确实隐式定义了\uuuu ne\uuuuu
。似乎如果不定义\uuuu ne\uuuuuu
,它会使用而不是\uuuu eq\uuu
。但是x==y
的真理并不意味着x=y
为假。这就是为什么你应该定义两者。