Python dataclasses
dataclasses
是 Python 3.7 中引入的一个模块,它提供了一个装饰器和一些函数,用于自动化地创建特殊方法,如 __init__()
和 __repr__()
,以减少样板代码。
主要特性:
- 自动化生成构造函数 (
__init__
) - 自动化生成表示函数 (
__repr__
) - 自动化生成比较函数 (
__eq__
,__lt__
, 等等) - 可选择地生成不可变实例 (通过
frozen=True
参数)
基础用法
@dataclasses.dataclass
class Point:
x: int
y: int
以上代码为 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 所有,未经允许不得转载!
喜欢我文章的朋友请随缘打赏,鼓励我创作更多更好的作品!