在 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__
(我必须这样做,因为我确实想从列表中继承),但我在这里寻找的是为什么我必须这样做的解释。