クラスがあり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 では、不等式に対する適切なデフォルトの動作 (つまり、等式の結果の反転) が自動的に作成されないためです。