Python可变映射类型MutableMapping

Python自定义字典类型MutableMapping

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1552257.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

关于pip install -e .的一点理解

笔者在安装库时对教程里面的pip install -e .产生了一些疑惑,查资料解决如下 参考资料:【python pip特殊用法】pip install -v -e . 命令详解-CSDN博客 首先Sources Root就是根目录 笔者最开始将ultralytics以pip install -e .方式安装在了D盘ultraly…

家用高清投影仪怎么选?目前口碑最好的投影仪推荐

双十一马上要到了,而且今年还有投影仪的家电国补,所以大家入手投影仪的需求也越来越多,但是家用高清投影仪怎么选?什么投影仪最适合家用?家庭投影仪哪个牌子质量最好?今天就给大家做一个2024性价比高的家用…

国庆节快乐

葡萄城在这里祝大家国庆快快乐: 10月葡萄城活动: 公开课 【从软件应用走向数据应用——葡萄城技术赋能数据挖掘】 新版本发布: 活字格 V10.0 Update1新版本发布

等保测评:企业数字安全的坚实盾牌

1.1 企业数字化转型的浪潮 在当今时代,企业数字化转型的浪潮正以前所未有的速度席卷全球,据IDC预测,到2023年,全球数字化转型支出将达到惊人的2.3万亿美元。这一趋势不仅重塑了企业的运营模式,更对企业的信息安全提出…

昇思MindSpore进阶教程--使能图算融合

大家好,我是刘明,明志科技创始人,华为昇思MindSpore布道师。 技术上主攻前端开发、鸿蒙开发和AI算法研究。 努力为大家带来持续的技术分享,如果你也喜欢我的文章,就点个关注吧 正文开始 图算融合是MindSpore特有的网络…

氨基酸在PDB文件中的原子命名规则

氨基酸在PDB文件中的原子命名规则 氨基和羧基上的原子都采用本名,C, N, O, H, etc. 其它原子除 H 外,所有原子命名均采用“原子名后缀[编号]”形式。整体命名方法类似于图论中求解最大流问题时所采用的标号法。首先α-C被命名为CA。其后按照成键关系逐级…

Markdown笔记管理工具Haptic

什么是 Haptic ? Haptic 是一个新的本地优先、注重隐私的开源 Markdown 笔记管理工具。它简约、轻量、高效,旨在提供您所需的一切,而不包含多余的功能。 目前官方提供了 docker 和 Mac 客户端。 Haptic 仍在积极开发中。以下是未来计划的一些…

尝鲜使用 YOLO V11 Fine-Tuning 训练自定义的目标检测模型

一、YOLO V11 2024年9月30日,Ultralytics官方团队宣布YOLOv11正式发布,标志着YOLO系列实时目标检测器的又一次重大升级。这一新版本不仅在准确性和检测速度上再创新高,还通过架构和训练方法的革新,极大地提升了目标检测的综合性能…

构建现代化社区医疗服务:SpringBoot平台

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及,互联网成为人们查找信息的重要场所,二十一世纪是信息的时代,所以信息的管理显得特别重要。因此,使用计算机来管理社区医院信息平台的相关信息成为必然。开发…

银行CRM系统的核心功能解析与应用价值

在当今竞争激烈的金融市场中,银行业务的成功与否,越来越依赖于高效而精准的客户关系管理系统(CRM)。Zoho CRM系统不仅帮助银行提升服务质量、增强客户满意度,还能有效地促进业务发展和风险控制。为了帮助读者更好地理解…

社区医疗健康管理:SpringBoot技术应用

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及,互联网成为人们查找信息的重要场所,二十一世纪是信息的时代,所以信息的管理显得特别重要。因此,使用计算机来管理社区医院信息平台的相关信息成为必然。开发…

如何从损坏的 USB 闪存驱动器中恢复文件

与您的内部硬盘驱动器一样,USB 闪存驱动器也将数据存储在其内存中。与笨重的硬盘不同,这些便携式拇指驱动器易于携带,并且很容易从中获取数据。除了有一天,当我们将其连接到 PC 只是为了发现数据无法访问时。您知道您保存了它&…

【算法竞赛】堆

堆是一种树形结构,树的根是堆顶,堆顶始终保持为所有元素的最优值。 有最大堆和最小堆,最大堆的根节点是最大值,最小堆的根节点是最小值。 本节都以最小堆为例进行讲解。 堆一般用二叉树实现,称为二叉堆。 二叉堆的典型应用有堆排序和优先队列。 二叉堆的概念 二叉堆是一棵…

vue2圆形标记(Marker)添加点击事件不弹出信息窗体(InfoWindow)的BUG解决

目录 一、问题详情 二、问题排查 三、解决方案 一、问题详情 地图上面的轨迹点希望能通过点击看到详细的经纬度信息,但是点击的时候就是显示不出来。 二、问题排查 代码都是参考高德的官方文档,初步看没有问题啊,但是点击事件就感觉失效…

Linux中的软硬链接和动静态库

硬链接 ln myfile.txt hard_file.link 264962 -rw-rw-r-- 2 zhangsan zhangsan 0 Sep 30 03:16 hard_file.link 264962 -rw-rw-r-- 2 zhangsan zhangsan 0 Sep 30 03:16 myfile.txt 273922 lrwxrwxrwx 1 zhangsan zhangsan 10 Sep 30 03:17 soft_file.link -> …

【Python报错已解决】error: subprocess-exited-with-error

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 专栏介绍 在软件开发和日常使用中,BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…

Docker容器、数据卷和数据挂载

目录 修改容器文件内容 步骤一 步骤二 步骤三 效果 总结 Docker数据卷 容器与数据耦合的问题 数据卷 创建数据卷 创建数据卷 查看所有数据 查看数据卷详细信息卷 总结 Docker数据挂载 举例 案例 总结 创建并运行一个MySQL容器,将宿主机目录直接挂…

欧几里得8月模考总结

绝对值可导问题 函数翻折后不存在尖点

低空经济时代来临,挑战和机遇详细分析

低空经济作为一种新兴的经济形态,正逐步成为推动国民经济发展的新增长点。它依托于低空空域,涵盖通用航空、无人机应用、航空运动、低空旅游等多个领域,展现了广阔的发展前景和巨大的发展潜力。本文旨在详细分析低空经济时代来临所带来的挑战…

Go AI 编程助手的使用 Fitten Code

Go AI 编程助手 Fitten Code 1、安装2、智能补全3、AI 问答4、生成代码5、代码转换6.生成注释7、解释代码8、生成测试9、检查 BUG11、优化代码12、对项目整项目分析 Go AI 编程助手的核心优势在于其能够显著提高编程效率,减少错误,并提供灵活的选择。‌ …