摘要:
@dataclass
从 Python 3.7(2018年6月)开始有的,
2025年在用 Python 3.10+,已经可以愉快地写最现代、最省内存的 dataclass 了。
# 旧时代
class Player:
def __init__(self, id, name, hp, mp, x, y, items):
self.id=id;
self.name=name;
self.hp=hp;
self.mp=mp
self.x=x;
self.y=y;
self.items=items or []
def __repr__(self): return f"Player({self.id},{self.name}...)"
def __eq__(self, other): return self.id == other.id
# 2025年顶级写法
@dataclass(slots=True, frozen=True, kw_only=True, order=True)
class Player:
id: int
name: str
hp: int = 100
mp: int = field(default=50, repr=False)
x: int = 0
y: int = 0
items: list = field(default_factory=list)
一、版本演变:
|
Python 版本 |
@dataclass 支持的高级参数 |
|
3.7 |
基础版(只有 init、repr、eq) |
|
3.8 |
支持 __slots__ |
|
3.10 |
支持 slots=True(省内存神器) |
|
3.11 |
支持 kw_only=True(防参数错乱) |
|
3.12 |
持 frozen=True + slots=True 组合更稳定 |
|
3.13 |
copy.replace() |
二、四大核心参数,缺一不可
- slots=True
- 放弃__dict__,改用固定数组存储属性。10万个对象轻松省几百MB,AI推理、游戏服务器、日志处理直接受益。
- frozen=True
- 对象创建后彻底锁死,任何属性修改直接抛FrozenInstanceError。多线程、配置中心、DTO传输再无篡改风险。
- kw_only=True
- 强制关键字参数,字段顺序彻底无关。联调时再也不用数第几个参数是哪个字段。
- order=True(常配合排序字段使用)
- 自动生成__lt__,sorted()一行搞定排行榜、优先级队列。
- Python 3.13 扔出copy.replace
- immutable对象实现“函数式更新”,热配置、状态机、树结构修改速度提升3倍以上,且零拷贝开销。
from copy import replace
@dataclass(frozen=True)
class Point:
x: int = 0
y: int = 0
p = Point(1, 2)
p_moved = replace(p, x=10) # 无缝“替换”,原对象不动
print(p_moved) # Point(x=10, y=2)
它不再是“可选项”,而是变成新项目的实际标准。缘由有三:
- 标准库实现,零依赖,迁移成本最低
- 参数组合覆盖90%实际需求,无需再引入pydantic、attrs
- 与类型系统完美贴合,mypy、pyright检查体验最佳
2025年,@dataclass已完成从“语法糖”到“性能基石”的蜕变。 代码行数更少,内存占用更低,运行时更安全,类型检查更友善——这四点同时成立的方案,整个Python生态目前仅此一个。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
相关文章
暂无评论...
