Python dataclasses
dataclass
是 Python 3.7 引入的一个装饰器和模块,目的是简化数据类的定义和操作。它通过自动生成初始化方法、表示方法和比较方法,为类提供结构化数据支持。
特性:
- 自动生成
__init__
、__repr__
和__eq__
方法。 - 支持字段默认值和默认工厂函数。
- 可以通过
field()
设置字段的元数据或特殊选项(如default
、default_factory
)。 - 支持
frozen
参数,使类的实例不可变。 - 支持继承,但需要注意字段的冲突和覆盖问题。
优点:
- 代码简洁,避免手动定义重复的方法。
- 易于维护,特别是在数据结构频繁变化的场景。
- 提供类型注解,便于静态分析和工具支持。
局限性:
- 不支持动态字段定义。
- 对复杂的业务逻辑支持有限。
- 性能略低于手动实现的类。
基础用法
from dataclasses import dataclass
@dataclass
class Point:
x: int
y: int
label: str = "Default Label"
p = Point(10, 20)
print(p) # 输出:Point(x=10, y=20, label='Default Label')
以上代码为 Point
类自动生成了 __init__
, __repr__
和 __eq__
等方法。
常用参数
frozen
: 如果设置为True
,则生成的对象是不可变的,即不能修改属性的值。order
: 如果设置为True
,则会生成比较方法,如__lt__
、__le__
等。repr
: 如果设置为False
,则不会生成__repr__
方法。
Field 对象
使用 dataclasses.field()
可以为特定字段设置默认值或其他特性。
@dataclasses.dataclass
class Point:
x: int
y: int = dataclasses.field(default=0)
使用场景
当你需要一个简单的类,主要用于存储数据,并希望自动为其生成常用的特殊方法时,dataclasses
是一个非常有用的工具。
默认值和默认工厂方法
@dataclasses.dataclass
class InventoryItem:
name: str
unit_price: float = 0.0
quantity_on_hand: int =
dataclasses.field(default_factory=list)
item = InventoryItem("apple")
不可变对象 (Frozen)
@dataclasses.dataclass(frozen=True)
class Point:
x: int
y: int
p = Point(1, 2)
# p.x = 3 # 这会引发一个错误,因为对象是不可变的
生成比较方法
@dataclasses.dataclass(order=True)
class Student:
grade: int
name: str
alice = Student(90, "Alice")
bob = Student(85, "Bob")
print(alice > bob) # 输出: True
忽略某些字段的比较
@dataclasses.dataclass
class WithUnrelated:
value: int
transient: int = dataclasses.field(compare=False)
a = WithUnrelated(1, 100)
b = WithUnrelated(1, 200)
print(a == b) # 输出: True,因为 `transient` 字段在比较时被忽略了
本文作者:Maeiee
本文链接:Python dataclasses
版权声明:如无特别声明,本文即为原创文章,版权归 Maeiee 所有,未经允许不得转载!
喜欢我文章的朋友请随缘打赏,鼓励我创作更多更好的作品!