首頁  >  文章  >  後端開發  >  如何在 Python 類別中實現等價:深入探討 __eq__、__ne__ 和雜湊?

如何在 Python 類別中實現等價:深入探討 __eq__、__ne__ 和雜湊?

Linda Hamilton
Linda Hamilton原創
2024-11-08 08:12:02362瀏覽

How to Achieve Equivalence in Python Classes: A Deep Dive into __eq__, __ne__, and Hashing?

在Python 類別中優雅地實現等價

在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:

對於運算元屬於不同類型的情況(無繼承),在eqne 中傳回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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn