2

在 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__默认提供的 my 没有被调用__ne__。如果我将 SomeOtherClassWhichInheritsFromList 更改为从对象而不是列表继承,它会按预期工作。

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

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

4

1 回答 1

4

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

Python 3 数据模型

您假设“在 Python 3 中,如果您提供一个方法,通常也会提供__eq__一个明智的方法来使用您的.”,这可能会发生什么 - 就是's方法做到了。没有提及您在数据模型文档中声明的行为 - 尽管没有显式超类(因此继承自)的类的行为与您描述的一样。__ne____eq__object__ne__object

于 2012-07-11T20:08:49.240 回答