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
my__eq__
がデフォルトで provided によって呼び出されていないことを示します__ne__
。リストではなくオブジェクトから継承するように SomeOtherClassWhichInheritsFromList を変更すると、期待どおりに動作します。
これは、リストに属性がないように見えるため、メソッド内__mro__
のすべてのsuper()
もの__eq__
がトリガーされないためですか?
注: my__ne__
を呼び出す独自のメソッドを追加できることはわかっ__eq__
ています (リストから継承したいので、これを行う必要があります) が、ここで探しているのは、そうしなければならない理由の説明です。