Dataclasses 数据类

@dataclasses.dataclass() 是Python 3.7及更高版本中引入的一个装饰器,用于简化数据封装类(即主要用于存储数据的类)的编写。 这个装饰器可以自动为类生成一些特殊方法, 例如 init() 和 repr() , eq(),减少了重复代码的编写。

例如以下代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
from dataclasses import dataclass

@dataclass
class InventoryItem:
    """Class for keeping track of an item in inventory."""
    name: str
    unit_price: float
    quantity_on_hand: int = 0

    def total_cost(self) -> float:
        return self.unit_price * self.quantity_on_hand

将添加多项内容,包括如下所示的 init():

1
2
3
4
def __init__(self, name: str, unit_price: float, quantity_on_hand: int = 0):
    self.name = name
    self.unit_price = unit_price
    self.quantity_on_hand = quantity_on_hand

自动添加方法的好处,可以减少__init__方法重复,可以对类属性自定义比较方法__eq__,

可读性要强,操作灵活。

适用场景

  • 当需要一个简单的类来存储数据时,例如配置、记录或其他结构化数据。
  • 在需要比普通字典更结构化、但不需要复杂方法的场景。
  • 当你希望类具有自动实现的比较和打印方法时。

原理

  • 自动方法生成:dataclass 装饰器会根据类中定义的字段自动创建 initrepreq 方法。这样,就不需要手动编写这些通常都很相似的方法。
  • 类型注解:dataclass 使用Python的类型注解来识别类中的字段。
  • 可定制性:可以通过传递参数给 @dataclass 装饰器来定制其行为,如设置 frozen=True 使实例不可变。

高级用法

  • 默认值:可以为数据类的字段指定默认值。
  • 不可变数据类:通过设置 frozen=True,你可以创建不可变的实例。
  • 继承:数据类可以继承其他数据类。
  • 字段元数据:可以使用 dataclasses.field 来为字段提供更多信息,如自定义默认值工厂、排除字段等。

参考