首頁 >後端開發 >Python教學 >抽象基底類別如何幫助完美重寫字典的行為?

抽象基底類別如何幫助完美重寫字典的行為?

DDD
DDD原創
2024-11-23 16:20:30187瀏覽

How Can Abstract Base Classes Help in Perfectly Overriding a Dictionary's Behavior?

完美重寫字典:使用抽象基底類別的指南

建立內建dict類型的子類別時,實現完美的實作可能具有挑戰性。不要覆寫整個 dict 類,請考慮採用另一種方​​法,使用 collections.abc 模組中的抽象基底類別 (ABC)。

使用 MutableMapping ABC

MutableMapping ABC 為行為類似於可變字典的類別提供了一個介面。透過實作此接口,您可以建立一個行為類似於字典的對象,而無需直接對其進行子類化。這是一個最小的範例:

from collections.abc import MutableMapping

class TransformedDict(MutableMapping):
    def __init__(self, *args, **kwargs):
        self.store = dict()
        self.update(dict(*args, **kwargs))  # use the free update to set keys

    def __getitem__(self, key):
        return self.store[self._keytransform(key)]

    def __setitem__(self, key, value):
        self.store[self._keytransform(key)] = value

    def __delitem__(self, key):
        del self.store[self._keytransform(key)]

    def __iter__(self):
        return iter(self.store)

    def __len__(self):
        return len(self.store)

    def _keytransform(self, key):
        return key

此實作為透過 _keytransform 方法操作鍵提供了基礎。透過在子類別中重寫此方法,您可以將自訂轉換套用至鍵。

使用ABC 的好處

實現MutableMapping 接口有幾個優點:

  • 完整性: ABC確保您已實作可變字典所需的所有方法。
  • 自動驗證: ABC 檢查您是否已實現所有必需的方法,使您可以及早發現缺失的實現。
  • 內置方法:您可以自動訪問get、setdefault、pop 等方法,而無需實現它們

示例用法

建立TransformedDict 的子類別並定義_keytransform方法讓您可以自訂鍵處理:

class MyTransformedDict(TransformedDict):
    def _keytransform(self, key):
        return key.lower()

s = MyTransformedDict([('Test', 'test')])
assert s.get('TEST') is s['test']
assert 'TeSt' in s

這個子類別允許不區分大小寫的密鑰存取和

附加說明

  • Pickling 與此方法無縫配合,因為您本質上是在內部使用常規字典。
  • 它通常不建議直接子類化 dict 等內建類型,因為它可能會導致混亂和意外行為。
  • 使用 ABC 為建立實作特定介面的物件提供了乾淨且可擴充的解決方案。

以上是抽象基底類別如何幫助完美重寫字典的行為?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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