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

时间:2018-05-27 03:46:12

标签: python python-3.x class

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

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

1 个答案:

答案 0 :(得分:6)

你没有 ,而python并没有强迫你去。事实上,documentation解释了为什么和为什么:

  

默认情况下,__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)

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