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 的作用:
  1. 创建不可变对象:实例创建后,字段值不能被修改。
  1. 当 frozen=True 且 eq=True(默认如此)时,会生成 __hash__:使对象可哈希,可以用作字典键或放入集合。
效果示例:

一般用途:

数据容器:用于存储不可变的数据结构
  1. 值对象:表示业务中的值对象,确保数据一致性
  1. 字典键:因为可哈希,可以用作字典键
  1. 替代 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 是一种不可变的数据容器,结合了元组的轻量性和类的可读性。
示例:
与普通元组的对比:

@dataclassnamedtuple 对比

特性
namedtuple
dataclass
Python 版本
2.6+
3.7+
不可变性
默认不可变
默认可变,可用 frozen=True
类型注解
不支持
支持
默认值
需要额外处理
原生支持
方法
自动生成
自动生成
灵活性
较低
较高
dataclass 替代 namedtuple 的优势:
dataclass 的优势:
  • 支持类型注解(x: int
  • 支持默认值(x: int = 0
  • 更灵活(可添加方法、属性)
  • 更现代的 Python 风格
注意:
  • 没有 frozen=True:字段引用可以修改,可变对象内部可以修改
  • 有 frozen=True:字段引用不能修改,但可变对象内部仍可修改(如 list.append)
【python003】字符串拼接【python005】LightGBM推理
Loading...