什么是 MutableMapping

MutableMapping 是 Python collections.abc 模块中的一个抽象基类,它定义了一个可变映射对象的最小接口。可变映射指的是可以进行增、删、改操作的映射类型,如 Python 的内置字典(dict)。如果要创建一个具有字典功能的自定义类,可以继承 MutableMapping,然后实现其中的一些核心方法。

MutableMapping 的基本方法

MutableMapping 要求至少实现以下五个方法:

  1. getitem(self, key):通过键访问值(如 mydict[key])。
  2. setitem(self, key, value):将键和值关联(如 mydict[key] = value)。
  3. delitem(self, key):删除给定键的键值对(如 del mydict[key])。
  4. iter(self):返回一个可迭代对象,用于遍历字典的键。
  5. len(self):返回字典中的键值对数量(如 len(mydict))。

此外,MutableMapping 还提供了一些已经实现的方法,例如 get(), keys(), values(), items() 等,方便在继承时直接使用。

实现 MutableMapping

通过一个简单的例子来看如何实现一个继承 MutableMapping 的自定义字典类。在这个例子中,将实现一个 “记录访问顺序的字典” 类,每次访问某个键时,会将其移动到字典的末尾。

from collections.abc import MutableMapping

class OrderedAccessDict(MutableMapping):
    def __init__(self, *args, **kwargs):
        self._store = dict()
        self._order = []  # 用于记录访问顺序
        self.update(dict(*args, **kwargs))  # 将初始值传递给字典

    def __getitem__(self, key):
        # 每次访问键时,将该键移到访问顺序的末尾
        if key in self._store:
            self._order.remove(key)
            self._order.append(key)
        return self._store[key]

    def __setitem__(self, key, value):
        if key not in self._store:
            self._order.append(key)
        self._store[key] = value

    def __delitem__(self, key):
        if key in self._store:
            self._order.remove(key)
        del self._store[key]

    def __iter__(self):
        return iter(self._order)

    def __len__(self):
        return len(self._store)

    def __repr__(self):
        return f"{self.__class__.__name__}({self._store})"

# 使用示例
ordered_dict = OrderedAccessDict(a=1, b=2, c=3)
print(ordered_dict)  # OrderedAccessDict({'a': 1, 'b': 2, 'c': 3})

# 访问 'a',它会被移动到末尾
print(ordered_dict['a'])
print(list(ordered_dict))  # ['b', 'c', 'a']

# 插入一个新键 'd'
ordered_dict['d'] = 4
print(list(ordered_dict))  # ['b', 'c', 'a', 'd']

解释:

  • self._store: 用于存储键值对的实际字典。 self._order: 一个列表,用于记录键的访问顺序。
  • getitem: 每次访问某个键时,我们会将该键移动到 self._order 的末尾。
  • setitem: 在插入一个新键时,将其添加到访问顺序列表中。
  • delitem: 删除键时,同时从存储和访问顺序列表中移除它。
  • iter: 返回一个迭代器,按访问顺序遍历键。

常见应用场景

  1. 缓存系统
    在实现缓存机制时,我们通常需要记录每个缓存项的使用情况,以便在缓存容量达到上限时淘汰最少使用的项。通过继承 MutableMapping,可以轻松创建一个类似于 LRU(最近最少使用)缓存的类。

  2. 数据库连接池
    在一些应用中,管理数据库连接池时,我们可能希望每次访问或使用连接时,记录其使用顺序,从而管理活跃连接的数量。

  3. 自定义配置类
    在某些配置系统中,我们希望将配置值存储在类似字典的对象中,并根据不同的访问顺序、权限或其他逻辑处理访问和修改操作。

Logo

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。

更多推荐