引言
在 Python 的广阔天地中,字典 (dict) 无疑是最为璀璨的明珠之一。它以其高效的键值对存储方式和灵活的操作特性,成为 Python 开发者日常编程中不可或缺的工具。然而,当标准字典无法满足我们的特殊需求时,Python 为我们提供了创建字典子类的优雅方式,让我们能够扩展字典的功能,打造专属的数据结构。
一、字典基础回顾:理解 Python 的 dict
在深入探讨字典子类之前,让我们先简要回顾一下 Python 字典的基本特性:
- 哈希表实现
- 无序集合
- 可变数据类型
- O(1) 平均时间复杂度
- Python 3.7+ 保持插入顺序
- 可动态增删键值对
标准字典提供了以下核心功能:
- 快速键值查找
- 动态大小调整
- 键的唯一性保证
- 丰富的内置方法(
get(),update(),pop()等)
二、为什么要创建字典子类?
标准字典虽然强大,但在某些场景下我们需要额外的功能或行为修改:
- 自动默认值:访问不存在的键时返回默认值而非抛出异常
- 键转换:自动将键转换为特定格式(如小写)
- 历史记录:跟踪字典的修改历史
- 类型限制:限制键或值的类型
- 持久化:自动将修改保存到数据库或文件
三、创建字典子类的三种方式
1. 直接继承 dict 类
这是最直接的方式,我们可以重写字典的方法或添加新方法:
class EnhancedDict(dict):
"""增强型字典,提供大小写不敏感的键访问"""
def __getitem__(self, key):
return super().__getitem__(key.lower())
def __setitem__(self, key, value):
super().__setitem__(key.lower(), value)
2. 使用 collections.UserDict
UserDict 是专门为继承而设计的包装类,相比直接继承 dict 更不容易出错:
from collections import UserDict
class HistoryDict(UserDict):
"""记录修改历史的字典"""
def __init__(self, *args, **kwargs):
().__init__(*args, **kwargs)
.history = []
():
.history.append()
().__setitem__(key, value)


