在本文中,我們將探討如何創建在各種場景下表現理想的字典的定制子類。
我們的目標是建立一個子類別'dict' 其中鍵總是為小寫。這個看似簡單的任務需要我們仔細重寫特定方法。
為了實現所需的按鍵行為,我們需要重寫 '__getitem__'、'__setitem__' 和 ' __delitem__' 方法。透過自訂這些方法,我們可以攔截關鍵互動並強制執行小寫轉換。
我們可以利用 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__
實現的「TransformedDict」可以與pickle一起使用,這要歸功於它內部對標準字典的依賴。
重要的是請注意,通常不建議直接子類化“dict”,因為它可能會導致意外的行為。透過利用 ABC,我們可以創建健壯且靈活的子類,這些子類遵循所需的接口,在本例中為「MutableMapping」。
以上是如何使用抽象基底類別建立具有小寫鍵的健壯且靈活的字典子類別?的詳細內容。更多資訊請關注PHP中文網其他相關文章!