Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Python文档在定义eq时说我需要定义ne?_Python_Operator Overloading_Equality_Inequality - Fatal编程技术网

为什么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
为假。这就是为什么你应该定义两者。