dataclass速查表

下面给你一份 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_index


8️⃣ __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)