dataclasses
是 Python 3.7 引入的模块,用于简化类的定义,特别是那些用于存储数据的类。它可以自动为类生成常见方法,如 __init__
、__repr__
和 __eq__
等,减少重复代码,提升开发效率。
1. 核心功能
dataclasses
提供了一个装饰器 @dataclass
,用于标记一个类为数据类。数据类的主要目标是存储数据,而非实现复杂的行为逻辑。
from dataclasses import dataclass@dataclass
class Point:x: inty: int
2. 主要特性
2.1 自动生成方法
__init__
:根据类的字段自动生成初始化方法。__repr__
:提供对象的字符串表示。__eq__
:生成用于比较对象是否相等的方法。
@dataclass
class Point:x: inty: intp1 = Point(1, 2)
p2 = Point(1, 2)
print(p1) # 输出: Point(x=1, y=2)
print(p1 == p2) # 输出: True
2.2 默认值和默认工厂
- 字段可以指定默认值或使用默认工厂(如列表、字典)。
from dataclasses import dataclass, field@dataclass
class Point:x: int = 0 # 默认值y: int = field(default_factory=list) # 默认工厂p = Point()
print(p) # 输出: Point(x=0, y=[])
2.3 不可变数据类
通过设置 frozen=True
参数,可以让数据类变为不可变对象。
@dataclass(frozen=True)
class Point:x: inty: intp = Point(1, 2)
# p.x = 10 # 会抛出错误:dataclasses.FrozenInstanceError
3. 字段选项
field
函数
field
提供了更细粒度的控制,可以设置字段的初始化行为、元数据等。
from dataclasses import dataclass, field@dataclass
class Person:name: strage: int = field(default=30) # 默认值为 30hobbies: list = field(default_factory=list) # 默认空列表id: int = field(init=False) # 不会被 `__init__` 初始化p = Person(name="Alice")
p.id = 1
print(p) # 输出: Person(name='Alice', age=30, hobbies=[], id=1)
4. 常用方法
4.1 asdict
和 astuple
将数据类实例转换为字典或元组。
from dataclasses import dataclass, asdict, astuple@dataclass
class Point:x: inty: intp = Point(1, 2)
print(asdict(p)) # {'x': 1, 'y': 2}
print(astuple(p)) # (1, 2)
4.2 自定义方法
数据类也支持用户定义自己的方法。
@dataclass
class Point:x: inty: intdef distance(self, other) -> float:return ((self.x - other.x) ** 2 + (self.y - other.y) ** 2) ** 0.5p1 = Point(0, 0)
p2 = Point(3, 4)
print(p1.distance(p2)) # 输出: 5.0
5. 字段排序和比较
数据类默认支持比较操作(如 <
, >
, <=
, >=
),也可以通过设置 order=True
控制排序。
@dataclass(order=True)
class Point:x: inty: intp1 = Point(1, 2)
p2 = Point(2, 1)
print(p1 < p2) # 输出: True (因为比较的是 (x, y))
6. 继承数据类
数据类可以继承其他数据类。
@dataclass
class Point:x: inty: int@dataclass
class Point3D(Point):z: intp = Point3D(1, 2, 3)
print(p) # 输出: Point3D(x=1, y=2, z=3)
7. 性能和限制
- 数据类的主要目的是简化代码,不建议用它来处理复杂的逻辑。
dataclasses
提供的功能以简化开发为主,对于需要自定义更多行为的类,可能需要手动编写相关方法。
总结
dataclasses
是一个强大且易用的模块,可以显著减少样板代码,特别适合定义简单的数据存储类。它的灵活性和功能使其成为现代 Python 开发中的一项核心工具。