在Python 中,自訂類別可以透過實作特殊方法eq 和 ne 分別表示== 和!= 運算子。這使得來自此類別的物件能夠根據其屬性來比較相等性。
實作等價性的一個簡單而有效的方法是比較包含物件屬性的字典:
class Foo: def __init__(self, item): self.item = item def __eq__(self, other): if isinstance(other, self.__class__): return self.__dict__ == other.__dict__ else: return False def __ne__(self, other): return not self.__eq__(other)
雖然此方法在同一類別的物件之間建立等效性,但在處理不相關類型的子類別或實例時面臨挑戰。要解決這些問題,以下注意事項很重要:
經典樣式類別的非交換性:
經典樣式Python 2 類別執行eq第一個運算元的 方法,而第二個運算元則呼叫ne 。為了確保對稱性,請考慮為不支援的運算元類型傳回 NotImplemented。
為不支援的型別回傳NotImplemented:
對於運算元屬於不同類型的情況(無繼承),在eq 和ne 中傳回NotImplemented 將比較委託給另一個運算元的反射方法。這確保了交換性並允許使用集合來確定唯一實例。
雜湊與集合處理:
預設情況下,物件使用其物件識別碼進行雜湊。為了確保集合內正確的比較,請重寫 hash 以根據物件的屬性計算一致的雜湊。
結合這些考慮因素會產生更穩健的結果對像等價的實現:
class Number: def __init__(self, number): self.number = number def __eq__(self, other): if isinstance(other, Number): return self.number == other.number return NotImplemented def __ne__(self, other): x = self.__eq__(other) if x is not NotImplemented: return not x return NotImplemented def __hash__(self): return hash(tuple(sorted(self.__dict__.items())))
此實現即使在子類和不相關的實例之間也能確保正確的等價和雜湊,提供更優雅和更全面的方法來支援Python 類別中的等價。
以上是如何在 Python 類別中實現等價:深入探討 __eq__、__ne__ 和雜湊?的詳細內容。更多資訊請關注PHP中文網其他相關文章!