繁体   English   中英

Python3:从__ne__定义时自动从列表继承中断__ne__?

[英]Python3: inheriting from list breaks automagically provided __ne__ when __eq__ is defined?

在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

指示__ne__没有被默认提供的__eq__调用。 如果我将SomeOtherClassWhichInheritsFromList更改为从对象而不是列表继承,则它将按预期工作。

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

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

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

Python 3数据模型

什么可能发生,你想的是“在Python 3,如果你提供了一个__eq__方法,一个明智的__ne__通常也提供了利用您的__eq__ 。” -是object__ne__方法做到这一点。 尽管没有显式超类(因此继承自object )的类的行为与您描述的一样,但是没有引用您在“数据模型”文档中声明的行为。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM