在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.使用namedtuple:
利用Python的namedtuples快速定義具有預先定義屬性的類別:
from collections import namedtuple Foo = namedtuple('Foo', ['item'])
namedtupuples用的相等比較。
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__s 可能是一個簡單的解決方案,但還有更優雅、更有效率的方法可用於實現相等比較在 Python 類別中。方法的選擇取決於您應用程式的特定要求。
以上是如何在Python類別中優雅地實現相等比較?的詳細內容。更多資訊請關注PHP中文網其他相關文章!