Python dataclass
学习dataclass · 难度:进阶 · +15XP
Python dataclass 数据类
dataclass 是 Python 3.7 引入的一个装饰器,用于自动生成类的 __init__、__repr__、__eq__ 等特殊方法。它极大地减少了样板代码,让数据类的定义变得简洁优雅,特别适合用于表示数据记录、DTO(数据传输对象)和配置类。
基本用法
from dataclasses import dataclass
@dataclass
class Student:
name: str
age: int
grade: float
courses: list = None # 提供默认值
# 自动生成 __init__ 和 __repr__
stu = Student('小明', 18, 92.5)
print(stu)
# Student(name='小明', age=18, grade=92.5, courses=None)
# 自动生成 __eq__
stu2 = Student('小明', 18, 92.5)
print(stu == stu2) # True
field() 配置选项
from dataclasses import dataclass, field
@dataclass
class Product:
name: str
price: float
tags: list = field(default_factory=list) # 可变默认值
# 不在 __repr__ 中显示
secret_key: str = field(default='', repr=False)
# 不在 __init__ 中作为参数
created_at: str = field(default='', init=False)
def __post_init__(self):
# 初始化后处理
if not self.created_at:
from datetime import datetime
self.created_at = datetime.now().isoformat()
p = Product('Laptop', 5999.99)
print(p) # Product(name='Laptop', price=5999.99, tags=[])
高级配置
from dataclasses import dataclass, field
@dataclass(order=True) # 启用排序
class Item:
sort_index: int = field(init=False, repr=False)
name: str
value: int
def __post_init__(self):
self.sort_index = self.value
@dataclass(frozen=True) # 不可变数据类
class Point:
x: float
y: float
p = Point(1.0, 2.0)
# p.x = 3.0 # FrozenInstanceError!不可修改
@dataclass(kw_only=True) # Python 3.10+: 仅限关键字参数
class Config:
host: str
port: int
debug: bool = False
dataclass 参数速查表
| 参数 | 默认值 | 说明 |
|---|---|---|
| init | True | 是否生成 __init__ 方法 |
| repr | True | 是否生成 __repr__ 方法 |
| eq | True | 是否生成 __eq__ 方法 |
| order | False | 是否生成排序方法 |
| frozen | False | 是否创建不可变对象 |
| slots | False | 是否使用 __slots__ 节省内存 |
| kw_only | False | 字段是否仅限关键字参数 |