オブジェクトインスタンスの属性による等価性を比較する 質問する

オブジェクトインスタンスの属性による等価性を比較する 質問する

クラスがありMyClass、そこには 2 つのメンバー変数fooと が含まれていますbar

class MyClass:
    def __init__(self, foo, bar):
        self.foo = foo
        self.bar = bar

このクラスのインスタンスが 2 つあり、それぞれがfooとに対して同一の値を持ちますbar

x = MyClass('foo', 'bar')
y = MyClass('foo', 'bar')

しかし、それらが等しいかどうかを比較すると、Python は次を返しますFalse

>>> x == y
False

Python でこれら 2 つのオブジェクトを等しいと見なすにはどうすればよいですか?

ベストアンサー1

メソッドを実装する必要があります__eq__:

class MyClass:
    def __init__(self, foo, bar):
        self.foo = foo
        self.bar = bar
        
    def __eq__(self, other): 
        if not isinstance(other, MyClass):
            # don't attempt to compare against unrelated types
            return NotImplemented

        return self.foo == other.foo and self.bar == other.bar

出力は次のようになります:

>>> x == y
True

実装すると、__eq__クラスのインスタンスは自動的にハッシュ不可になり、セットや辞書に保存できなくなることに注意してください。不変型をモデル化していない場合 (つまり、オブジェクトの存続期間中に属性の値が変更される可能性がある場合foo) bar、インスタンスをハッシュ不可のままにしておくことをお勧めします。

不変型をモデル化する場合は、データモデルフックも実装する必要があります。__hash__:

class MyClass:
    ...

    def __hash__(self):
        # necessary for instances to behave sanely in dicts and sets.
        return hash((self.foo, self.bar))

ループして値を比較するといった一般的な解決策は__dict__お勧めできません。比較できない型やハッシュできない型が含まれている可能性があるため、真に一般的な解決策にはなり得ません__dict__

注意:Python 3より前では、__cmp__の代わりに__eq__。Python 2ユーザーは、__ne__Python 2 では、不等式に対する適切なデフォルトの動作 (つまり、等式の結果の反転) が自動的に作成されないためです。

おすすめ記事