在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__
(因为我想从列表中继承,所以我必须这样做),但我在寻找什么这里解释了为什么我必须这样做。
答案 0 :(得分:4)
如果您定义__eq__
,则必须始终定义__ne__
。
从Python 3.2的“数据模型”文档:
“”比较运算符之间没有隐含的关系.x == y的真实性并不意味着x!= y是假的。因此,在定义 eq ()时,还应该定义 ne ()以便运算符按预期运行。“”“
如果您认为“在Python 3中,如果您提供__eq__
方法,通常还会提供合理的__ne__
并使用您的__eq__
”,那么可能会发生什么。这是object
的{{1}}方法。没有引用您在数据模型文档中声明的行为 - 尽管没有显式超类的类(继承自__ne__
)的行为与您描述的一致。