首页 > 编程 > Python > 正文

Python3.7 dataclass使用指南小结

2020-02-16 01:20:48
字体:
来源:转载
供稿:网友

dataclass简介

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

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

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

基于上述原因,通常自己实现一个dataclass是繁琐而无聊的,而dataclass单一固定的行为正适合程序为我们自动生成,于是dataclasses模块诞生了。

配合类型注解语法,我们可以轻松生成一个实现了__init__,__repr__,__cmp__等方法的dataclass:

from dataclasses import dataclass@dataclassclass 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

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

dataclass的使用

我们分x步介绍dataclass的使用,首先是如何定义一个dataclass。

定义一个dataclass

dataclasses模块提供了一个装饰器帮助我们定义自己的数据类:

@dataclassclass Lang:  """a dataclass that describes a programming language"""  name: str = 'python'  strong_type: bool = True  static_type: bool = False  age: int = 28

我们定义了一个描述某种程序语言特性的数据类——Lang,在接下来的例子中我们都会用到这个类。

在数据类被定义后,会根据给出的类型注解生成一个如下的初始函数:

def __init__(self, name: str='python',      strong_type: bool=True,      static_type: bool=False,      age: int=28):  self.name = name  self.strong_type = strong_type  self.static_type = static_type  self.age = age

可以看到初始化操作都已经自动生成了,让我们试用一下:

>>> Lang()Lang(name='python', strong_type=True, static_type=False, age=28)>>> Lang('js', False, False, 23)Lang(name='js', strong_type=False, static_type=False, age=23)>>> Lang('js', False, False, 23) == Lang()False>>> Lang('python', True, False, 28) == Lang()True            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表