如何使用抽象基底類別建立具有小寫鍵的健壯且靈活的字典子類別?

Susan Sarandon
發布: 2024-11-24 03:49:09
原創
867 人瀏覽過

How Can I Create a Robust and Flexible Dictionary Subclass with Lowercase Keys Using Abstract Base Classes?

使用ABC 實現「完美」的字典子類

在本文中,我們將探討如何創建在各種場景下表現理想的字典的定制子類。

挑戰

我們的目標是建立一個子類別'dict' 其中鍵總是為小寫。這個看似簡單的任務需要我們仔細重寫特定方法。

重寫按鍵操作方法

為了實現所需的按鍵行為,我們需要重寫 '__getitem__'、'__setitem__' 和 ' __delitem__' 方法。透過自訂這些方法,我們可以攔截關鍵互動並強制執行小寫轉換。

使用 ABC 進行最小轉換

我們可以利用 ABC(抽象基類),而不是直接子類化“dict” “collections.abc”模組。這種方法提供了更清晰、更健壯的實作。

透過實作「MutableMapping」ABC,我們確保符合 dict 介面。以下程式碼片段提供了轉換後的字典的最小實作:

from collections.abc import MutableMapping

class TransformedDict(MutableMapping):
    def __init__(self, *args, **kwargs):
        self.store = dict()
        self.update(dict(*args, **kwargs))

    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」方法負責將所需的轉換應用於鍵。在我們的例子中,它只是返回小寫的鍵:

def _keytransform(self, key):
    return key.lower()
登入後複製

繼承和擴展

要使用轉換後的字典,我們可以繼承“TransformedDict”並在'_keytransform' 方法。例如:

class MyTransformedDict(TransformedDict):

    def _keytransform(self, key):
        return key.lower()

s = MyTransformedDict([('Test', 'test')])

assert s.get('TEST') is s['test']   # free get
assert 'TeSt' in s                  # free __contains__
登入後複製

Pickling and Beyond

實現的「TransformedDict」可以與pickle一起使用,這要歸功於它內部對標準字典的依賴。

重要的是請注意,通常不建議直接子類化“dict”,因為它可能會導致意外的行為。透過利用 ABC,我們可以創建健壯且靈活的子類,這些子類遵循所需的接口,在本例中為「MutableMapping」。

以上是如何使用抽象基底類別建立具有小寫鍵的健壯且靈活的字典子類別?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板