完美重写字典:使用抽象基类的指南
创建内置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 接口有几个优点:
示例用法
创建 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
该子类允许不区分大小写的密钥访问和检索。
附加说明
以上是抽象基类如何帮助完美重写字典的行为?的详细内容。更多信息请关注PHP中文网其他相关文章!