首页 > 后端开发 > Python教程 > 如何使用抽象基类创建具有小写键的健壮且灵活的字典子类?

如何使用抽象基类创建具有小写键的健壮且灵活的字典子类?

Susan Sarandon
发布: 2024-11-24 03:49:09
原创
879 人浏览过

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
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板