Python可变映射类型MutableMapping

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

像素艺术家

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值