Python オブジェクトのカスタマイズされた等価比較
Python のデフォルトの動作では、オブジェクト インスタンスが同一の属性を共有している場合でも、オブジェクト インスタンスを別個のエンティティとして扱います。この動作は、オブジェクトの ID ではなく内部プロパティに基づいてオブジェクトを比較する場合に問題となる可能性があります。オブジェクト インスタンスの等価比較をカスタマイズする方法は次のとおりです。
eq メソッドの定義
カスタム クラスのオブジェクトの等価比較方法を制御するには、クラス定義内で eq メソッドを定義します。このメソッドは、self と other の 2 つの引数を取ります。 self パラメータは現在のオブジェクトを参照し、other は比較対象のオブジェクトを表します。
<code class="python">class MyClass: def __init__(self, foo, bar): self.foo = foo self.bar = bar def __eq__(self, other): if not isinstance(other, MyClass): # Don't compare to unrelated types return NotImplemented return self.foo == other.foo and self.bar == other.bar</code>
__eq__ を実装すると、基本的にクラスのインスタンスのカスタム等価性チェックを定義することになります。この例では、メソッドは self と other の foo 属性と bar 属性を比較し、両方が等しい場合に True を返します。
eq
eq を実装すると、クラスのインスタンスがハッシュ化不能になります。これは、辞書内のキーとして、またはセット内の要素として使用できないことを意味します。これは、Python が hash() 関数に依存してオブジェクトがハッシュ可能かどうかを判断し、オブジェクトのハッシュ値がその内部コンテンツから導出されるからです。オブジェクトの内容は属性の割り当てによって変更される可能性があるため、確実にハッシュすることはできません。
不変型をモデル化している場合は、一貫性を確保するためにhash メソッドも実装する必要があります。
一般的な解決策を避ける
dict を反復処理して値を比較することにより、一般的な等価比較メソッドを定義しようとしています。はお勧めしません。このアプローチでは、オブジェクトの辞書内に比較不可能またはハッシュ不可能な型が含まれている場合、オブジェクトを正しく比較できない可能性があります。
以上がPython オブジェクトの等価比較をカスタマイズするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。