前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python3.7 新特性——dataclass装饰器

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

作者头像
雷子
发布2023-12-26 16:50:29
1300
发布2023-12-26 16:50:29
举报

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

后记

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-12-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 雷子说测试开发 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档