Python中dataclass库

文章目录

  • dataclass语法
    • 一、 简介
    • 二、 装饰器参数
    • 三、 数据属性
      • 1、 参数
      • 2、 使用示例
      • 3、 注意事项
    • 四、 其他
      • 1、 常用函数
      • 2、 继承
      • 3、 总结

dataclass语法

一、 简介

官方文档的地址为:https://docs.python.org/3.9/library/dataclasses.html

dataclass的定义位于PEP-557,根据定义一个dataclass是指“一个带有默认值的可变的namedtuple”,广义的定义就是有一个类,它的属性均可公开访问,可以带有默认值并能被修改,而且类中含有与这些属性相关的类方法,那么这个类就可以称为dataclass,再通俗点讲,dataclass就是一个含有数据及操作数据方法的容器。

乍一看可能会觉得这个概念不就是普通的class么,然而还是有几处不同:

  1. 相比普通class,dataclass通常不包含私有属性,数据可以直接访问
  2. dataclass的repr方法通常有固定格式,会打印出类型名以及属性名和它的值
  3. dataclass拥有__eq____hash__魔法方法
  4. dataclass有着模式单一固定的构造方式,或是需要重载运算符,而普通class通常无需这些工作

我们来创建一个实例:

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__方法:

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

同时使用dataclass也有一些好处,它比namedtuple更灵活。同时因为它是一个常规的类,所以你可以享受继承带来的便利。

二、 装饰器参数

参数为dataclass()

  • init:如果为true(默认),__init__()将生成一个方法。

    如果类已经定义__init__(),则忽略此参数。

  • repr:如果为true(默认),__repr__()将生成一个方法。生成的 repr 字符串将具有类名以及每个字段的名称和 repr,按照它们在类中定义的顺序。不包括标记为从 repr 中排除的字段。例如: 。InventoryItem(name='widget', unit_price=3.0, quantity_on_hand=10)

    如果类已经定义__repr__(),则忽略此参数。

  • eq:如果为true(默认),__eq__()将生成一个方法。此方法按顺序比较类,就好像它是其字段的元组一样。比较中的两个实例必须是相同的类型。

    如果类已经定义__eq__(),则忽略此参数。

  • order: 如果为真(默认为False),将生成

你可能感兴趣的:(#,Python第三方库,python,开发语言,哈希算法)