Python MutableMapping介绍
在 Python 中,collections.abc.MutableMapping
和 typing.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.MutableMapping | typing.MutableMapping |
---|---|---|
作用 | 定义可变映射的抽象基类,用于实现自定义字典 | 仅用于类型注解,不提供任何方法 |
是否包含方法 | ✅ 是,继承后可自动拥有 dict 方法 | ❌ 否,只是类型提示 |
适用场景 | 需要创建自定义 dict 结构 | 用于 mypy 进行静态类型检查 |
4️⃣ 总结
collections.abc.MutableMapping
适用于自定义字典类型,用于实现自己的dict
变体。typing.MutableMapping
仅用于类型标注,不会影响代码运行。- 如果要实现一个字典类,继承
collections.abc.MutableMapping
;如果只是做类型注解,用typing.MutableMapping
! - 推荐用法:从 Python 3.9 开始,直接从
collections.abc
导入MutableMapping
,而不是从typing
模块导入。