Python dataclasses

dataclassPython 3.7 引入的一个装饰器和模块,目的是简化数据类的定义和操作。它通过自动生成初始化方法、表示方法和比较方法,为类提供结构化数据支持。

特性:

优点:

局限性:


基础用法

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__ 等方法。


常用参数


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 所有,未经允许不得转载!


喜欢我文章的朋友请随缘打赏,鼓励我创作更多更好的作品!