根据定义一个dataclass是指“一个带有默认值的可变的namedtuple”,广义的定义就是有一个类,它的属性均可公开访问,可以带有默认值并能被修改,而且类中含有与这些属性相关的类方法,那么这个类就可以称为dataclass,再通俗点讲,dataclass就是一个含有数据及操作数据方法的容器。
与类的区别
相比普通class,dataclass通常不包含私有属性,
数据可以直接访问 dataclass的repr方法通常有固定格式,
会打印出类型名以及属性名和它的值 dataclass拥有__eq__ 、__hash__
dataclass有着模式单一固定的构造方式,或是需要重载运算符,而普通class通常无需这些工作
配合类型注解语法,我们可以轻松生成一个实现了__init__,__repr__,__cmp__等方法的dataclass:
如何用:
代码语言:javascript复制from dataclasses import dataclass
@dataclass
class Position:
name: str
lon: float
lat: float
P1=Position(name='12',lon=1,lat=2)
print(P1.__dict__)
结果打印:
代码语言:javascript复制{'name': '12', 'lon': 1, 'lat': 2}
当然,我们也可以给默认值
代码语言:javascript复制from dataclasses import dataclass
@dataclass
class Position:
name: str
lon: float = 0.0
lat: float = 0.0
P1=Position(name='12')
print(P1.__dict__)
结果:
代码语言:javascript复制{'name': '12', 'lon': 0.0, 'lat': 0.0}
这样,在我们解析数据,就可以设计这样的,比如接口返回的json,我们把参数给成默认值,这样在解析的完,获取不到,就不会存在keyerror错误了。
更高级
代码语言:javascript复制from dataclasses import dataclass
from typing import List
@dataclass
class Position:
name: str
lon: float = 0.0
lat: float = 0.0
@dataclass
class Deck:
cards: List[Position]
listone=[Position(name='leizi')]
d=Deck(cards=listone)
print(d.__dict__)
结果:
代码语言:javascript复制{'cards': [Position(name='leizi', lon=0.0, lat=0.0)]}
在我们解析数据的时候,我们知道参数的格式,可以这么处理
代码语言:javascript复制from dataclasses import dataclass
dictone={"name":"leizi","lon":233}
@dataclass
class Position:
name: str
lon: float = 0.0
lat: float = 0.0
c=Position(**dictone)
print(c)
j=c.lat
if j==0.0:
print("没有值")
else:
print("有值")
在解析的时候,给了初始值默认,这样及时获取不到也不会有问题
代码语言:javascript复制print(c.lat)
print(dictone['lat'])
打印结果:
如果解析接口返回的字典,没有参数就会抛出来KeyError异常,如果用dataclass得类来处理,就可以解决这个问题。
后记
发现问题,解决问题。遇到问题,慢慢解决问题即可。