Python でカスタム クラスを定義するには、多くの場合、特別なメソッドを使用して等価比較を実装する必要があります。 、eq、ne__。一般的なアプローチには、インスタンスの __dict 属性の比較が含まれます。
__dict__s を比較すると、次のことを確認する簡単な方法が提供されます。等価:
def __eq__(self, other): if isinstance(other, self.__class__): return self.__dict__ == other.__dict__ else: return False
このアプローチは便利ですが、欠点もあります:
dict 比較を使用するより洗練された代替方法があります。
1. __slots__ を定義します:
クラスで slots を宣言して、インスタンス属性を特定のものに制限します:
class Foo: __slots__ = ['item'] def __init__(self, item): self.item = item
これにより、比較が効率的に行われ、任意の属性の追加が防止されます。インスタンスへの属性。
2.名前付きタプルを使用します:
Python の名前付きタプルを活用して、事前定義された属性を持つクラスをすばやく定義します。
from collections import namedtuple Foo = namedtuple('Foo', ['item'])
名前付きタプルは、そのままの状態で等価比較をサポートします。
3. hash と __eq__:
hash をオーバーライドして、重要なクラス属性に基づいてハッシュを返し、等しいオブジェクトに対して一意のハッシュを確保します。次に、eq を実装して、ハッシュではなく属性に基づいてオブジェクトを比較します。
class Foo: def __init__(self, item): self.item = item def __hash__(self): return hash(self.item) def __eq__(self, other): return self.item == other.item
4.メタクラスの使用:
メタクラスを使用すると、カスタム動作を持つクラスを動的に作成できます。クラス属性に基づいて eq メソッドと ne メソッドを自動的に定義するメタクラスを作成できます:
class MyMeta(type): def __new__(cls, name, bases, dct): attributes = tuple(dct.keys()) def __eq__(self, other): return all(getattr(self, attr) == getattr(other, attr) for attr in attributes) dct['__eq__'] = __eq__ return super().__new__(cls, name, bases, dct)
5。カスタム基本クラスからの継承:
目的の動作のためにすでに定義されている eq と hash を使用して基本クラスを作成します。他のクラスはこの基本クラスを継承して、その等価比較機能を利用できます。
__dict__ の比較は単純な解決策ですが、等価比較の実装には、より洗練された効率的なアプローチが利用できます。 Python クラスで。どの方法を選択するかは、アプリケーションの特定の要件によって異なります。
以上がPython クラスで等価比較をエレガントに実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。