在本文中,我们将探讨如何创建在各种场景下表现理想的字典的定制子类。
我们的目标是构建一个子类'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中文网其他相关文章!