@dataclass适用于仅存储和传递数据、无复杂逻辑的类,如API响应、配置参数、数据库记录或函数参数;需类型注解,支持默认值、frozen、order及field定制。
Python 的 @dataclass 是简化类定义的实用工具,它自动为你生成常见方法(如 __init__、__repr__、__eq__),让数据容器类写起来更简洁、可读性更强,也更少出错。
当你需要一个主要用来存储和传递数据的类,且不涉及复杂逻辑或行为封装时,@dataclass 就很合适。比如:
只需在类前加 @dataclass 装饰器,所有带类型注解的字段会自动参与初始化和表示:
from dataclasses import dataclass@dataclass class Person: name: str age: int city: str = "Beijing" # 支持默认值
p = Person("Alice", 28) print(p) # Person(name='Alice', age=28, city='Beijing')
注意:字段必须有类型注解(Python 3.6+),否则不会被识别为 dataclass 字段;有默认值的字段要放在无默认值字段之后。
立即学习“Python免费学习笔记(深入)”;
@dataclass 支持多个参数来调整行为:
init=False:不自动生成 __init__,适合只做数据容器、由其他方式构造实例repr=False:关闭自动生成的 __repr__,避免敏感字段暴露eq=False:禁用自动 __eq__,适用于需要自定义相等逻辑的场景frozen=True:让实例不可变(类似 namedtuple),赋值会报错order=True:额外生成 __lt__ 等比较方法,支持排序(需所有字段可比较)用 field() 可对单个字段做精细控制:
default / default_factory:设置默认值,后者用于可变对象(如 list、dict)init=False:该字段不参与 __init__,但保留在实例中(适合运行时计算字段)repr=False:该字段不出现在 __repr__ 输出里(如密码、token)compare=False:该字段不参与 __eq__ 或 __lt__ 比较例如:
from dataclassesimport dataclass, field
@dataclass class Book: title: str author: str tags: list = field(default_factory=list) # 安全的空列表 _id: int = field(init=False, repr=False) # 不进初始化,也不显示在 repr 中