Python3:在定义__eq__时自动提供__ne__继承自列表中断?

时间:2012-07-11 16:17:18

标签: python inheritance python-3.x super

在Python 3中,如果您提供__eq__方法,通常还会提供合理的__ne__,以便使用您的__eq__。但是,我(在Python 3中):

class SomeOtherClassWhichInheritsFromList(list):
    def __init__(self):
        super().__init__()
        self.parval = 44

    def __eq__(self, other):
        print ("IN SomeOtherClassWhichInheritsFromList EQ")
        if isinstance(other, SomeOtherClassWhichInheritsFromList):
            return super().__eq__(other) and self.parval == other.parval
        return NotImplemented

class SomeClass(SomeOtherClassWhichInheritsFromList):
    def __init__(self, val):
        super().__init__()
        self.val = val

    def __eq__(self, other):
        print ("IN SomeClass EQ")
        if isinstance(other, SomeClass):
            return super().__eq__(other) and self.val == other.val
        return NotImplemented

如果我这样做:

sc = SomeClass(99)
sc2 = SomeClass(104)

print (sc != sc2)

我希望看到:

IN SomeClass EQ
IN SomeOtherClassWhichInheritsFromList EQ
True

但我反而看到了:

False

表示默认情况下__eq__未调用我的__ne__。如果我将SomeOtherClassWhichInheritsFromList更改为从object而不是list继承,它将按预期工作。

这是因为列表似乎没有__mro__属性,因此我的super()方法中的所有__eq__内容都无法触发?

注意:我知道我可以添加自己的__ne__方法来调用我的__eq__(因为我想从列表中继承,所以我必须这样做),但我在寻找什么这里解释了为什么我必须这样做。

1 个答案:

答案 0 :(得分:4)

如果您定义__eq__,则必须始终定义__ne__。 从Python 3.2的“数据模型”文档: “”比较运算符之间没有隐含的关系.x == y的真实性并不意味着x!= y是假的。因此,在定义 eq ()时,还应该定义 ne ()以便运算符按预期运行。“”“

Python 3 Data Model

如果您认为“在Python 3中,如果您提供__eq__方法,通常还会提供合理的__ne__并使用您的__eq__”,那么可能会发生什么。这是object的{​​{1}}方法。没有引用您在数据模型文档中声明的行为 - 尽管没有显式超类的类(继承自__ne__)的行为与您描述的一致。