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 模块导入。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值