type
Post
status
Published
date
Apr 15, 2026
slug
python004
summary
tags
python
category
python
icon
password
example-row
@dataclass
@dataclass 是 Python 3.7+ 引入的装饰器,用于自动生成类方法。frozen=True 的作用:- 创建不可变对象:实例创建后,字段值不能被修改。
- 当
frozen=True且eq=True(默认如此)时,会生成__hash__:使对象可哈希,可以用作字典键或放入集合。
效果示例:
一般用途:
数据容器:用于存储不可变的数据结构
- 值对象:表示业务中的值对象,确保数据一致性
- 字典键:因为可哈希,可以用作字典键
- 替代 namedtuple:比 namedtuple 更灵活,支持类型注解和默认值
常见参数简述:
参数 | 作用 |
frozen=True | 冻结实例,不能改属性 |
order=True | 生成比较运算符(依赖字段顺序与类型) |
repr=True(默认) | 是否生成 __repr__ |
eq=True(默认) | 是否生成 __eq__ |
unsafe_hash=False | 是否在特定条件下生成 __hash__(与 frozen 等有关,需谨慎) |
repr 用法
在
@dataclass 里,repr=True(默认就是 True) 表示:为这个类自动生成 __repr__ 方法。效果:
repr=True:调用repr(obj)或交互式里直接写变量名时,会得到类似Point(x=1, y=2)这种类名 + 各字段名和值的字符串(具体格式由dataclass实现决定)。
repr=False:不生成这类__repr__,类会沿用基类的__repr__,或没有的话行为按 MRO 来。
和
field(repr=False) 的区别:- 装饰器上的
repr:管要不要整段生成__repr__。
- 某个字段上的
field(repr=False):在仍然生成__repr__的前提下,把该字段从输出里藏起来(例如密码、大对象)。
repr=True = 让 dataclass 帮你写 __repr__,方便调试和日志里看清对象内容。示例:
1. 默认:
repr=True(自动生成 __repr__)2. 整类关闭:
@dataclass(repr=False)3. 只隐藏部分字段:
field(repr=False)order 使用
order=False(默认):只按你设置的eq等生成相等性,不生成大小比较。
order=True:自动生成__lt__、__le__、__gt__、__ge__,让实例可以< <= > >=比较。
- 比较规则:按类里 字段声明顺序,把各字段值当成 元组 做逐元比较(和 Python 比较元组一样)。
order=True时,要求eq=True(若写order=True, eq=False会ValueError)。
- 默认就是
eq=True,所以一般直接写@dataclass(order=True)即可。
示例:
上面示例先比
major,相等再比 minor。namedtuple
namedtuple 是 Python 标准库 collections 模块中的一个工厂函数,用于创建带字段名的元组子类。基本概念:
namedtuple 是一种不可变的数据容器,结合了元组的轻量性和类的可读性。示例:
与普通元组的对比:
@dataclass 与namedtuple 对比
特性 | namedtuple | dataclass |
Python 版本 | 2.6+ | 3.7+ |
不可变性 | 默认不可变 | 默认可变,可用 frozen=True |
类型注解 | 不支持 | 支持 |
默认值 | 需要额外处理 | 原生支持 |
方法 | 自动生成 | 自动生成 |
灵活性 | 较低 | 较高 |
dataclass 替代 namedtuple 的优势:
dataclass 的优势:
- 支持类型注解(
x: int)
- 支持默认值(
x: int = 0)
- 更灵活(可添加方法、属性)
- 更现代的 Python 风格
注意:
- 没有
frozen=True:字段引用可以修改,可变对象内部可以修改
- 有
frozen=True:字段引用不能修改,但可变对象内部仍可修改(如 list.append)
- 作者:黄x黄
- 链接:https://hxhowl.site/article/python004
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
相关文章

