当前位置: 首页 > article >正文

Python MutableMapping介绍

在 Python 中,collections.abc.MutableMappingtyping.MutableMapping 实际上是同一个概念,只是它们来自不同的模块。从 Python 3.9 开始,typing 模块中的许多类型别名(如 MutableMapping)被推荐直接从 collections.abc 中导入,因为 collections.abc 提供了更直接的抽象基类(ABCs)定义。

collections.abc.MutableMapping 和 typing.MutableMapping 都用于表示可变映射类型(如 dict),但它们的用途和功能略有不同。


1️⃣ collections.abc.MutableMapping

collections.abc.MutableMapping 是 Python 内置的 抽象基类(ABC,Abstract Base Class),用于表示可变映射类型(即支持 __getitem____setitem____delitem__ 和 __iter__ 的对象)。

🔹 主要作用

  • 提供映射(类似 dict)的抽象基类,让自定义映射类可以继承它并实现必要的方法。
  • 继承 MutableMapping 后,只需实现核心方法__getitem____setitem____delitem____iter__ 和 __len__),就可以自动获得完整的 dict 行为(如 .keys().values().items() 等)。

🔹 示例

from collections.abc import MutableMapping

class MyDict(MutableMapping):
    def __init__(self):
        self.store = {}

    def __getitem__(self, key):
        return self.store[key]

    def __setitem__(self, key, value):
        self.store[key] = value

    def __delitem__(self, key):
        del self.store[key]

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

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

# 创建实例并测试
d = MyDict()
d["a"] = 10
print(d["a"])  # ✅ 10
del d["a"]

继承 MutableMapping 后,我们只需要实现 5 个方法,其他字典方法(如 update()get())都会自动继承!

2️⃣ typing.MutableMapping

typing.MutableMapping 用于类型标注,表示字典类的类型,但不提供任何方法实现。

🔹 主要作用

  • 适用于类型注解,用于标注某个对象是可变映射类型,如 dict 或自定义的 MutableMapping
  • 不会提供任何默认方法,而只是一个类型提示,用于静态类型检查(如 mypy)。

🔹 示例

from typing import MutableMapping

def update_dict(d: MutableMapping[str, int], key: str, value: int):
    d[key] = value

my_dict = {"a": 1, "b": 2}
update_dict(my_dict, "c", 3)
print(my_dict)  # ✅ {'a': 1, 'b': 2, 'c': 3}

🔸 MutableMapping[str, int] 表示 d 必须是一个键为 str,值为 int** 的可变映射(如 dict)!


3️⃣ 两者的核心区别

区别点collections.abc.MutableMappingtyping.MutableMapping
作用定义可变映射的抽象基类,用于实现自定义字典仅用于类型注解,不提供任何方法
是否包含方法✅ 是,继承后可自动拥有 dict 方法❌ 否,只是类型提示
适用场景需要创建自定义 dict 结构用于 mypy 进行静态类型检查

4️⃣ 总结

  • collections.abc.MutableMapping 适用于自定义字典类型,用于实现自己的 dict 变体。
  • typing.MutableMapping 仅用于类型标注,不会影响代码运行。
  • 如果要实现一个字典类,继承 collections.abc.MutableMapping;如果只是做类型注解,用 typing.MutableMapping 
  • 推荐用法:从 Python 3.9 开始,直接从 collections.abc 导入 MutableMapping,而不是从 typing 模块导入。

http://www.kler.cn/a/547286.html

相关文章:

  • Jetpack Compose系列教程之(10)——State及remeber
  • LabVIEW袜品压力测试系统
  • yolov8断点续练的时候报错如下
  • Linux系统中常见的词GNU是什么意思?
  • 六、面向对象编程(2)
  • STM32之SG90舵机控制
  • 【快速入门】Unity 常用组件(功能块)
  • 在illustrator中,如何绘制一个简单的茶壶?
  • Kubernetes控制平面组件:etcd(二)
  • Python学习心得编码与解码
  • 一维差分算法篇:高效处理区间加减
  • Mac安装JD-GUI
  • Postman入门:环境变量和全局变量
  • 【Go并发编程】Goroutine 调度器揭秘:从 GMP 模型到 Work Stealing 算法
  • 「软件设计模式」工厂方法模式(Factory Method) vs 抽象工厂模式(Abstract Factory)
  • arm linux下的中断处理过程。
  • 如何使用Jsoup获取动态加载的内容
  • Banana Pi OpenWRT One 官方路由器的第一印象
  • matlab平面波展开法计算的二维声子晶体带隙
  • 【R语言】非参数检验