![](/img/trans.png)
[英]Why do the Python docs say I need to define __ne__ when I define __eq__?
[英]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,如果你提供了一个__eq__
方法,一个明智的__ne__
通常也提供了利用您的__eq__
。” -是object
的__ne__
方法做到这一点。 尽管没有显式超类(因此继承自object
)的类的行为与您描述的一样,但是没有引用您在“数据模型”文档中声明的行为。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.