11

マジック メソッド をオーバーライドして、 にある基本メソッドにアクセスしよう__eq__とすると、エラーが発生します。これがバグであるはずはありませんが、確かに次のように感じます。superobject

class A(object):
    def __eq__(self, other):
        return super(A, self).__eq__(other)
A() == 0

# raises AttributeError: 'super' object has no attribute '__eq__'

これはobject.__eq__存在するため直感的class A(object): passではありませんが、存在しないためです。私が間違っていなければ__eq__チェックisに頼るので、それがここでの回避策かもしれませんが、is代わりに使用することsuperはミックスインフレンドリーではありません。私の場合はその方法で問題ありませんが、そうでない場合もあります。

このように機能する理由に関する提案や情報は__eq__素晴らしいでしょう。

4

2 に答える 2

4

Will's answer に記載されているように、object()実際にはインスタンスに対してまったく実装されていません__eq__(python 2.7)。

オブジェクトのインスタンスが等しいobject.__eq__かどうかをチェックするメソッドであるに違いないと信じるように存在するという事実にだまされています

代わりに、object.__eq__実際には から継承されたクラス メソッドであり、type型が等しいかどうかをチェックするために使用されます。

つまり、object == intやなどの式を処理しobject == objectます。

于 2016-05-23T01:53:53.433 に答える
2

これは、object()が実際には を実装していないため__eq__()です。ここでの「デフォルト」は次のようになります。

class A(object):
    def __eq__(self, other):
        if self is other:
            return True

        return self == other

しかし、あなたが試みていたことがうまくいった場合、実際にselfは親クラスのインスタンスが等しいかどうかをチェックしていることになりますother。そして、それは同じオブジェクト ( self) であるため、そうなるでしょう。したがって、コードに最も近いものは実際には次のようになります。

class A(object):
    def __eq__(self, other):
        if self is other:
            return True

        return super(A, self) == other
于 2016-05-23T01:38:35.910 に答える