当前位置: 首页 > news >正文

掌握python的dataclass,让你的代码更简洁优雅!

在这里插入图片描述

"dataclass"是从"Python3.7"版本开始,作为标准库中的模块被引入。
随着"Python"版本的不断更新,"dataclass"也逐步发展和完善,为"Python"开发者提供了更加便捷的数据类创建和管理方式。
"dataclass"的主要功能在于帮助我们简化数据类的定义过程。 本文总结了几个我平时使用较多"dataclass"技巧。

1.传统的类定义方式

class CoinTrans:def __init__(self,id: str,symbol: str,price: float,is_success: bool,addrs: list,) -> None:self.id = idself.symbol = symbolself.price = priceself.addrs = addrsself.is_success = is_success
if __name__ == "__main__":coin_trans = CoinTrans("id01", "BTC/USDT", "71000", True, ["0x1111", "0x2222"])print(coin_trans)
  • 运行结果:
<__main__.CoinTrans object at 0x0000022A891FADD0>
# 在上面的 CoinTrans 类中添加下面的方法
def __str__(self) -> str:return f"交易信息:{self.id}, {self.symbol}, {self.price}, {self.addrs}, {self.is_success}"
  • 再次运行,结果如下:
交易信息:id01, BTC/USDT, 71000, ['0x1111', '0x2222'], True

2.dataclass装饰器定义类

  • 下面看看使用"dataclass"装饰器来定义上面同样的类有多简单。
from dataclasses import dataclass@dataclass
class CoinTrans:id: strsymbol: strprice: floatis_success: booladdrs: list
  • 再次运行:
if __name__ == "__main__":coin_trans = CoinTrans("id01", "BTC/USDT", "71000", True, ["0x1111", "0x2222"])print(coin_trans)
  • 得到如下结果:
CoinTrans(id='id01', symbol='BTC/USDT', price='71000', is_success=True, addrs=['0x1111', '0x2222'])
  • 不需要"init",也不需要"str",只要通过"@dataclass"装饰之后,就可以打印出对象的具体内容。

2.1默认值
  • "dataclass’装饰器的方式来定义类,设置默认值很简单,直接在定义属性时就可以设置。
@dataclass
class CoinTrans:id: str = "id01"symbol: str = "BTC/USDT"price: float = "71000.8"is_success: bool = Trueaddrs: list[str] = ["0x1111", "0x2222"]if __name__ == "__main__":coin_trans = CoinTrans()print(coin_trans)
  • 运行之后发现,在"addrs"属性那行会报错:
ValueError: mutable default <class 'list'> for field addrs is not allowed: use default_factory
def gen_list():return ["0x1111", "0x2222"]@dataclass
class CoinTrans:id: str = "id01"symbol: str = "BTC/USDT"price: float = "71000.8"is_success: bool = Trueaddrs: list[str] = field(default_factory=gen_list)if __name__ == "__main__":coin_trans = CoinTrans()print(coin_trans)
  • 再次运行,可以正常执行:
CoinTrans(id='id01', symbol='BTC/USDT', price='71000.8', is_success=True, addrs=['0x1111', '0x2222']
2.2隐藏敏感信息
@dataclass
class CoinTrans:id: str = "id01"symbol: str = "BTC/USDT"price: float = "71000.8"is_success: bool = field(default=True, repr=False)addrs: list[str] = field(default_factory=gen_list, repr=False)
  • 再次运行后显示:
CoinTrans(id='id01', symbol='BTC/USDT', price='71000.8')
2.3只读对象
if __name__ == "__main__":coin_trans = CoinTrans()print(f"修改前: {coin_trans}")coin_trans.symbol = "ETH/USDT"print(f"修改后: {coin_trans}")
  • 运行结果:
修改前: CoinTrans(id='id01', symbol='BTC/USDT', price='71000.8')
修改后: CoinTrans(id='id01', symbol='ETH/USDT', price='71000.8')
  • 设置"frozen"属性之后,看看修改属性值会怎么样:
@dataclass(frozen=True)
class CoinTrans:id: str = "id01"#... 省略 ...
  • 再次运行,会发现修改属性会触发异常。
修改前: CoinTrans(id='id01', symbol='BTC/USDT', price='71000.8')
Traceback (most recent call last):File "D:\projects\python\samples\data_classes\main.py", line 66, in <module>coin_trans.symbol = "ETH/USDT"^^^^^^^^^^^^^^^^^File "<string>", line 4, in __setattr__
dataclasses.FrozenInstanceError: cannot assign to field 'symbol'
2.4转化为元组和字典
from dataclasses import dataclass, field, astuple, asdictif __name__ == "__main__":coin_trans = CoinTrans()print(astuple(coin_trans))print(asdict(coin_trans))
  • 运行结果:
('id01', 'BTC/USDT', '71000.8', True, ['0x1111', '0x2222'])
{'id': 'id01', 'symbol': 'BTC/USDT', 'price': '71000.8', 'is_success': True, 'addrs': ['0x1111', '0x2222']}

3.总结

图片

  • 最后希望你编程学习上不急不躁,按照计划有条不紊推进,把任何一件事做到极致,都是不容易的,加油,努力!相信自己!

文末福利

  • 最后这里免费分享给大家一份Python全套学习资料,希望能帮到那些不满现状,想提升自己却又没有方向的朋友,也可以和我一起来学习交流呀。

包含编程资料、学习路线图、源代码、软件安装包等!【[点击这里]】领取!

  • ① Python所有方向的学习路线图,清楚各个方向要学什么东西
  • ② 100多节Python课程视频,涵盖必备基础、爬虫和数据分析
  • ③ 100多个Python实战案例,学习不再是只会理论
  • ④ 华为出品独家Python漫画教程,手机也能学习

可以扫描下方二维码领取【保证100%免费

在这里插入图片描述


http://www.mrgr.cn/news/24308.html

相关文章:

  • 中秋节好物抢先看!中秋佳节有什么好用又实惠的好物推荐!
  • 黑神话怎么录?游戏录屏必备,探索2024年7款游戏录屏软件排行榜
  • MWORKS 2024b 新版发布:全球首创的Julia静态代码生成
  • centos(在线、离线)安装iptables
  • 【ArcGIS Pro实操第一期】研究区域制图-以粤港澳GBA地区为例
  • 14种实际上有效的AI营销方法(专业推荐)
  • 华为 HCIP-Datacom H12-821 题库 (15)
  • Unity AddressablesLoad加载
  • 安全帽识别摄像机
  • Java 学习中使用文件、网络连接等资源时,未正确关闭资源,导致资源泄漏应该怎么办?
  • HC-SR04超声波传感器详解(STM32)
  • 缺乏大模型经验,还有机会吗?
  • 低代码平台与统一待办:提升工作效率的新趋势
  • 一个Android App最少有几个线程?实现多线程的方式有哪些?
  • k8s防火墙networkPolicy,其他规则和端口规则ports的匹配顺序,进站策略ingress和出站策略egress中,ports规则的常用方法。
  • oracle数据库安装和配置:详细教程
  • python轻量级异步定时任务
  • QT QPrinter无弹窗后台打印
  • 构建高效 Python Web API:RESTful 设计与 GraphQL 实践
  • iOS 知识点记录