2

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__ています (リストから継承したいので、これを行う必要があります) が、ここで探しているのは、そうしなければならない理由の説明です。

4

1 に答える 1

4

定義する場合は、常に__eq__定義する必要があります。Python 3.2__ne__の「データ モデル」ドキュメンテーションから:演算子が期待どおりに動作するように、ne ()も定義する必要があります。

Python 3 データ モデル

「Python 3 では、メソッドを提供すると、通常は . を利用する__eq__賢明なものも提供されます。 」- そのメソッドがそれを行うということです。Data Model doc で述べた動作への参照はありませんが、明示的なスーパークラスを持たないクラス (したがって から継承) は、説明したとおりに動作します。__ne____eq__object__ne__object

于 2012-07-11T20:08:49.240 に答える