抽象基类如何帮助完美重写字典的行为?

DDD
发布: 2024-11-23 16:20:30
原创
160 人浏览过

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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板