dataclass速查表
已于 2026年02月03日 13:33 修改
访问次数:0
下面给你一份 Python dataclass 的常见用法清单,从基础到进阶,基本覆盖日常 90% 的使用场景 👇
1️⃣ 基本用法
from dataclasses import dataclass
@dataclass
class User:
name: str
age: int
u = User("Alice", 18)
print(u.name, u.age)
✔ 自动生成:
- __init__
- __repr__
- __eq__
2️⃣ 设置默认值
@dataclass
class User:
name: str
age: int = 18
3️⃣ 使用 default_factory
适合 可变对象(list / dict / set)
from dataclasses import dataclass, field
@dataclass
class User:
name: str
tags: list[str] = field(default_factory=list)
🚫 不要这样:
tags: list = [] # 会被所有实例共享
4️⃣ 禁止修改(不可变对象)
@dataclass(frozen=True)
class Point:
x: int
y: int
p = Point(1, 2)
# p.x = 3 ❌ 会报错
5️⃣ 控制字段是否参与比较 / repr
@dataclass
class User:
name: str
password: str = field(repr=False, compare=False)- repr=False:不显示
- compare=False:不参与 ==
6️⃣ 自定义排序
@dataclass(order=True)
class Score:
value: int
name: str自动生成:
- < <= > >=
7️⃣ 指定排序字段(sort_index)
@dataclass(order=True)
class Item:
sort_index: int = field(init=False, repr=False)
price: int
name: str
def __post_init__(self):
self.sort_index = self.price
# 这里排序的依据Item类定义的第一个字段,不一定叫sort_index8️⃣ __post_init__
在 __init__ 后执行,适合校验或派生字段
@dataclass
class User:
name: str
age: int
def __post_init__(self):
if self.age < 0:
raise ValueError("age must be >= 0")9️⃣ 不生成 __init__
@dataclass(init=False)
class Config:
x: int🔟 类变量(不会成为字段)
from typing import ClassVar
@dataclass
class User:
role: ClassVar[str] = "user"
name: str
1️⃣1️⃣ 继承 dataclass
@dataclass
class Base:
id: int
@dataclass
class User(Base):
name: str
⚠ 父类字段必须在子类字段前
1️⃣2️⃣ 转 dict / tuple
from dataclasses import asdict, astuple
asdict(u)
astuple(u)
1️⃣3️⃣ 判断是否是 dataclass
from dataclasses import is_dataclass
is_dataclass(u) # True
is_dataclass(User) # True
1️⃣4️⃣ slots(Python 3.10+)
@dataclass(slots=True)
class User:
name: str
age: int
✔ 更省内存
✔ 禁止动态加属性
1️⃣5️⃣ 和 typing 配合
from typing import Optional
@dataclass
class User:
name: str
email: Optional[str] = None
📌 常见使用场景
- DTO / VO / 配置类
- API 请求 / 响应模型
- 替代简单的 NamedTuple
- 数据清洗 & 中间结构
评论(0)