Pythonでは、オブジェクトの等価性をテストするために assertEqual
や assertIs
といったメソッドが提供されています。しかし、これらのメソッドは値や参照の等価性をテストします。では、2つのオブジェクトが同じ属性を持つ場合、それらを等価と見なすにはどうすればよいでしょうか?
この問題を解決するためには、__eq__
メソッドを実装することで、Pythonに2つのオブジェクトが等価であると認識させることができます。以下にその例を示します。
class MyClass:
def __init__(self, foo, bar):
self.foo = foo
self.bar = bar
def __eq__(self, other):
if not isinstance(other, MyClass):
return NotImplemented
return self.foo == other.foo and self.bar == other.bar
このコードでは、MyClass
の2つのインスタンスが等価であると見なされるための条件を定義しています。それは、foo
と bar
の両方の属性が等しい場合です。
なお、__eq__
メソッドを実装すると、クラスのインスタンスはハッシュ不可能(setsやdictsに格納できない)になります。これは、foo
や bar
のような属性がオブジェクトの寿命中に値を変更できる場合、インスタンスをハッシュ不可能にすることが推奨されているためです。
以上が、Pythonでオブジェクトの等価性をアサートする方法についての説明です。これにより、テストケースの作成やデバッグ作業がより容易になることでしょう。