为什么可以在类中覆盖__eq__和__ne__?

Lov*_*ing 2 python class python-3.x

Python提供了重载==运算符AND !=运算符的功能.但为什么?是不是足够重载==!=自动相反(实际值)==

一个人的结果不应该自动暗示对方吗?

cs9*_*s95 6

你不必到,蟒蛇并没有强迫你.事实上,文档解释了什么和为什么:

默认情况下,除非是结果,否则__ne__()委托__eq__()并反转结果NotImplemented.比较运算符之间没有其他隐含的关系,例如,(x<yx==y)的真实性并不意味着x<=y.

一般来说,事实x==y并非需要暗示这x!=y是错误的.如果您的数据模型需要反映这种关系,那么python可以让您轻松解决这个问题.

请注意,对于早期版本的python,甚至没有暗示这种关系.例如,

class Foo:
    def __init__(self, val):
        self.val = val

    def __eq__(self, other):
        return self.val == other.val

f1, f2 = Foo(1), Foo(1)
Run Code Online (Sandbox Code Playgroud)

现在,f1 == f2返回True任何版本.然而, 在python-3.x 上f1 != f2返回False,但True在python-2.x上(因为__ne__并不暗示在python-2.x上,并且通常两个用户定义的对象如果它们的ID不相同则不相等,即不同一个对象).