简化Python类:使用数据类(dataclasses)
在编写 Python 类时,你是否经常编写繁琐的 __init__、__repr__ 和 __eq__ 方法?从 Python 3.7 开始,标准库提供了 dataclasses 装饰器,让类的定义变得前所未有的简洁。
什么是数据类?
数据类是一个装饰器,它会根据类属性自动生成 __init__、__repr__、__eq__ 等方法。我们来看一个例子:
from dataclasses import dataclass
@dataclass
class Book:
title: str
author: str
price: float
短短几行,我们就拥有了完整的初始化、可读字符串表示和相等比较功能。无需再手写 self.title = title 等重复代码。
字段默认值与类型提示
数据类充分利用了 Python 的类型注解,并允许直接给字段赋默认值:
@dataclass
class Book:
title: str
author: str
price: float = 0.0
in_stock: bool = True
注意:有默认值的字段必须放在无默认值字段之后,这与函数参数规则一致。
不可变实例:frozen=True
如果你希望实例创建后不可修改,只需设置 frozen=True:
@dataclass(frozen=True)
class Point:
x: int
y: int
尝试修改 p.x = 10 会抛出 FrozenInstanceError。这提供了类似命名元组(namedtuple)的不可变性,但更灵活。
高级定制
数据类还支持 order=True 自动生成比较方法,以及 field 函数进行更细粒度的控制(如排除字段由 __repr__ 显示)。例如:
from dataclasses import field
@dataclass
class User:
id: int
name: str
password: str = field(repr=False) # 不显示密码
何时使用数据类?
当你需要存储数据的容器,并且主要操作是访问属性而非复杂逻辑时,数据类是最佳选择。它比字典更规范,比普通类更简洁,比命名元组更强大。
从简单的配置对象到复杂的业务实体,数据类正在成为 Python 项目中不可或缺的工具。如果你还没有尝试过,现在就在你的代码中引入 @dataclass 吧!