Python3.7 新特性——dataclass装饰器

2023-12-26 16:50:29 浏览数 (3)

根据定义一个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得类来处理,就可以解决这个问题。

后记

发现问题,解决问题。遇到问题,慢慢解决问题即可。

0 人点赞