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

译文带你理解Python的dataclass装饰器

@dataclass 是 Python dataclasses 模块中的一个 decorator。当使用 @dataclass 装饰器时,它会自动生成一些特殊方法,包括:

  • _ _ init _ _:用于初始化字段的构造函数
  • _ _ repr _ _:对象的字符串表示
  • _ _ eq _ _:对象之间的相等比较
  • _ _ hash _ _:使对象可用作字典键(如果值是可哈希的)

除了上述列出的方法之外,@dataclass 装饰器还有两个重要的属性。

  • Order(顺序):如果为 True(默认为 False),将生成 [__lt__()](<https://docs.python.org/3/reference/datamodel.html#object.__lt__>)[__le__()](<https://docs.python.org/3/reference/datamodel.html#object.__le__>)[__gt__()](<https://docs.python.org/3/reference/datamodel.html#object.__gt__>)[__ge__()](<https://docs.python.org/3/reference/datamodel.html#object.__ge__>) 方法;即 @dataclass(order=True)
  • Immutability(不可变性):通过使用 frozen=True 参数,可以使字段变为不可变;即 @dataclass(frozen=True)

简而言之,@dataclass 装饰器的主要目标是简化类的创建。

dataclass 装饰器的优势

使用 dataclass 装饰器有几个优势:

  • 减少样板代码:通过自动生成常见特殊方法,减少类所需的样板代码。
  • 可读性:通过使代码更简洁,集中在数据表示上,提高了代码的可读性。
  • 默认值:可以直接在类定义中为属性提供默认值,减少了显式 __init__() 方法的需求。
  • 不可变性:通过将 @dataclassfrozen=True 选项结合使用,可以创建不可变的数据类,确保实例在创建后无法修改。

用法

from dataclasses import dataclass@dataclass
class Person:name: strage: int

在这个例子中,Person 类被注解为 @dataclass,并声明了两个字段(nameage)。__init__()__repr__()__eq__()__hash__() 方法会自动生成。下面是如何使用每个生成的方法的解释:

  • __init__(self, ...)**:__init__ 方法会自动生成,参数对应于被注释属性。可以通过为属性提供值来创建类的实例。
person = Person('Sam', 45)
  • __repr__(self) -> str__repr__ 方法返回对象的字符串表示,用于调试和记录。在打印对象或在 f-string 中使用时,将调用 __repr__ 方法。
person # Person(name='Sam', age=45)
  • __eq__(self, other) -> bool__eq__ 方法根据属性检查两个对象是否相等。在使用等号运算符 (==) 比较对象时使用。
# 用法
person1 = Person('Sam', 45)
person1person2 = Person('Sam', 46)
person2print(person1 == person2) # False。 
  • __hash__(self) -> int__hash__ 方法为对象生成哈希值,允许实例用作集合和字典中的键。当类用作字典中的键或集合中的元素时,需要这个方法。

顺序

如果包括 order=True 选项,将生成额外的顺序方法(__lt____le____gt____ge__)。这些方法允许使用小于、小于或等于、大于和大于或等于运算符比较实例。如果在没有 order 的情况下对 Person 对象进行比较,将引发 TypeError

添加顺序后,我们可以执行比较。

order 默认为 False,这意味着除非显式启用,否则不会生成比较方法。比较基于字段值,而不是对象标识。

不可变性

使用 frozen=True 属性可以使 @dataclass 不可变;默认为 False

在上面的代码中,我们能够重新分配值给 Personname 字段。添加 frozen=True 后,将引发异常,不允许重新分配。

注意性能影响:frozen=True 会增加轻微的开销,因为需要额外检查不可变性。

总结

使用 dataclasses 模块,我们可以在类定义中为字段分配默认值。

默认值可以是任何数据类型,包括其他数据类或可变对象。它们在定义类时仅计算一次,而不是每次创建实例时。

相关文章:

译文带你理解Python的dataclass装饰器

dataclass 是 Python dataclasses 模块中的一个 decorator。当使用 dataclass 装饰器时&#xff0c;它会自动生成一些特殊方法&#xff0c;包括&#xff1a; _ _ init _ _&#xff1a;用于初始化字段的构造函数_ _ repr _ _&#xff1a;对象的字符串表示_ _ eq _ _&#xff1a…...

【C语言】实现程序的暂停

编写程序时&#xff0c;有时候需要让程序在某些地方暂停执行&#xff0c;等待用户输入或者观察程序执行结果。在 C 语言中&#xff0c;有多种方法可以实现程序的暂停&#xff0c;包括 system("pause")、getchar() 和 while ((c getchar()) ! \n && c ! EOF)…...

Hana SQL+正则表达式

目录 一、Pre 前言 二、知识点拆解 1&#xff09;case when…then…else 2&#xff09;json_value 函数 拓展资料 3&#xff09;CAST 函数 拓展资料 4) ROUND 函数 5&#xff09;occurences_regexpr 函数 拓展资料 6&#xff09;正则表达式 拓展资料 三、整合分析…...

【笔记】顺利通过EMC试验(16-41)-视频笔记

目录 视频链接 P1:电子设备中有哪些主要骚扰源 P2:怎样减小DC模块的骚扰 P3:PCB上的辐射源究竟在哪里 P4:怎样控制PCB板的电磁辐射 P5:多层线路板是解决电磁兼容问题的简单方法 P6:怎样处理地线上的裂缝 P7:怎样降低时钟信号的辐射 P8:为什么IO接口的处理特别重要 P9…...

Qlik Sense 调用NPrinting生成On-Demand报表

安装 Qlik Sense On-Demand 报表控件 On-Demand 报表控件添加按钮&#xff0c;该按钮按需生成 Qlik NPrinting 报表。它包括在 Dashboard bundle 中。 当您希望用户能够使用应用程序中的选择作为过滤器在 Qlik Sense 中打印预定义 Qlik NPrinting 报表时&#xff0c;On-Deman…...

ElasticSearch重建/创建/删除索引操作 - 第501篇

历史文章&#xff08;文章累计500&#xff09; 《国内最全的Spring Boot系列之一》 《国内最全的Spring Boot系列之二》 《国内最全的Spring Boot系列之三》 《国内最全的Spring Boot系列之四》 《国内最全的Spring Boot系列之五》 《国内最全的Spring Boot系列之六》 E…...

数据写入HBase(scala)

package sourceimport org.apache.hadoop.hbase.{HBaseConfiguration, TableName} import org.apache.hadoop.hbase.client.{ConnectionFactory, Put} import org.apache.hadoop.hbase.util.Bytesobject ffff {def main(args: Array[String]): Unit {//hbase连接配置val conf …...

Codeforces Round 799 (Div. 4)

目录 A. Marathon B. All Distinct C. Where’s the Bishop? D. The Clock E. Binary Deque F. 3SUM G. 2^Sort H. Gambling A. Marathon 直接模拟 void solve() {int ans0;for(int i1;i<4;i) {cin>>a[i];if(i>1&&a[i]>a[1]) ans;}cout<&l…...

为什么要用云手机养tiktok账号

在拓展海外电商市场的过程中&#xff0c;许多用户选择采用tiktok短视频平台引流的策略&#xff0c;以提升在电商平台上的流量&#xff0c;吸引更多消费者。而要进行tiktok引流&#xff0c;养号是必不可少的一个环节。tiktok云手机成为实现国内跨境养号的一种有效方式&#xff0…...

vue pc端网页实现自适应

一、基本原理 pc端做自适应可以用rem来实现&#xff0c;啥是rem&#xff0c;自己百度 二、新建rem.ts文件 // rem等比适配配置文件 // 基准大小 const baseSize 14 // 设置 rem 函数 function setRem () {// 当前页面宽度相对于 1920宽的缩放比例&#xff0c;可根据自己需要…...

Android 13以上版本读写SD卡权限适配

如题&#xff0c;最近工作上处理的问题&#xff0c;把解决方案简单逻列出来&#xff0c;供有需要的朋友参考之 解决方案&#xff1a; 1、配置权限 <uses-permission android:name"android.permission.READ_MEDIA_IMAGES" /><uses-permission android:name&q…...

并查集模板:食物链详解

import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader;public class Main {static int N 50010;static int n,m; //n个动物,m局判断static int[] p new int[N]; //p[i]是i的根节点static int[] d new int[N]; //d[i]表示i到…...

使用WAF防御网络上的隐蔽威胁之反序列化攻击

​ 什么是反序列化 反序列化是将数据结构或对象状态从某种格式转换回对象的过程。这种格式通常是二进制流或者字符串&#xff08;如JSON、XML&#xff09;&#xff0c;它是对象序列化&#xff08;即对象转换为可存储或可传输格式&#xff09;的逆过程。 反序列化的安全风险 反…...

05. 交换机的基本配置

文章目录 一. 初识交换机1.1. 交换机的概述1.2. Ethernet_ll格式1.3. MAC分类1.4. 冲突域1.5. 广播域1.6. 交换机的原理1.7. 交换机的3种转发行为 二. 初识ARP2.1. ARP概述2.2. ARP报文格式2.3. ARP的分类2.4. 免费ARP的作用 三. 实验专题3.1. 实验1&#xff1a;交换机的基本原…...

yolo将标签数据打到原图上形成目标框

第一章 目标&#xff1a;为了查看自己在标注标签时是否准确&#xff0c;写了这段代码来将标注的框打到原图上 第二章 步骤&#xff1a;进行反归一化得到坐标画出矩形框 第二行是目标图片对应的txt,第三行是目标图片 第三章 全部代码如下&#xff1a; import cv2 import …...

002-00-02【大红ai源码】dolphinscheduler3.2.0 源码环境搭建------by孤山村头王大爷家女儿大红

【ai阅读源码-dolphinscheduler】 DolphinScheduler 开发手册1、软件要求2、克隆代码库3、编译打包4、代码风格5、新建数据库&#xff0c;导入元数据。6&#xff0c; 启动后端6.1 启动api-server 6.2 启动master-server6.3 启动worker-server 7 启动前端 DolphinScheduler 开发…...

python-自动化篇-运维-监控-如何使⽤Python处理和解析⽇志⽂件?-实操记录

文章目录 1. 选择日志文件格式&#xff1a; 确定要处理的日志文件的格式。不同的日志文件可能具有不同的格式&#xff0c;如文本日志、CSV、JSON、XML等。了解日志文件的格式对解析⾮常重要。2. 打开日志文件&#xff1a; 使⽤Python的文件操作功能打开日志文件&#xff0c;以便…...

代码随想录算法训练营DAY6 | 哈希表(1)

DAY5休息一天&#xff0c;今天重启~ 哈希表理论基础&#xff1a;代码随想录 Java hash实现 &#xff1a;java 哈希表-CSDN博客 一、LeetCode 242 有效的字母异位词 题目链接&#xff1a;242.有效的字母异位词 思路&#xff1a;设置字典 class Solution {public boolean isAnag…...

【嵌入式学习】C++QT-Day3-C++基础

笔记 见我的博客&#xff1a;https://lingjun.life/wiki/EmbeddedNote/19Cpp 作业 设计一个Per类&#xff0c;类中包含私有成员:姓名、年龄、指针成员身高、体重&#xff0c;再设计一个Stu类&#xff0c;类中包含私有成员:成绩、Per类对象p1&#xff0c;设计这两个类的构造函…...

表贴式PMSM的直接转矩控制(DTC)MATLAB仿真模型

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 模型简介 表贴式PMSM的直接转矩控制(DTC),直接使用滞环控制对转矩和磁链进行控制&#xff0c;相对于传统的FOC控制而言&#xff0c;其不需要进行解耦变换&#xff0c;在此次的有以下几点需要注意&#xff1a…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成

厌倦手动写WordPress文章&#xff1f;AI自动生成&#xff0c;效率提升10倍&#xff01; 支持多语言、自动配图、定时发布&#xff0c;让内容创作更轻松&#xff01; AI内容生成 → 不想每天写文章&#xff1f;AI一键生成高质量内容&#xff01;多语言支持 → 跨境电商必备&am…...

3403. 从盒子中找出字典序最大的字符串 I

3403. 从盒子中找出字典序最大的字符串 I 题目链接&#xff1a;3403. 从盒子中找出字典序最大的字符串 I 代码如下&#xff1a; class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

聊一聊接口测试的意义有哪些?

目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开&#xff0c;首…...

LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》

这段 Python 代码是一个完整的 知识库数据库操作模块&#xff0c;用于对本地知识库系统中的知识库进行增删改查&#xff08;CRUD&#xff09;操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 &#x1f4d8; 一、整体功能概述 该模块…...

通过 Ansible 在 Windows 2022 上安装 IIS Web 服务器

拓扑结构 这是一个用于通过 Ansible 部署 IIS Web 服务器的实验室拓扑。 前提条件&#xff1a; 在被管理的节点上安装WinRm 准备一张自签名的证书 开放防火墙入站tcp 5985 5986端口 准备自签名证书 PS C:\Users\azureuser> $cert New-SelfSignedCertificate -DnsName &…...

十九、【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建

【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建 前言准备工作第一部分:回顾 Django 内置的 `User` 模型第二部分:设计并创建 `Role` 和 `UserProfile` 模型第三部分:创建 Serializers第四部分:创建 ViewSets第五部分:注册 API 路由第六部分:后端初步测…...

CSS 工具对比:UnoCSS vs Tailwind CSS,谁是你的菜?

在现代前端开发中&#xff0c;Utility-First (功能优先) CSS 框架已经成为主流。其中&#xff0c;Tailwind CSS 无疑是市场的领导者和标杆。然而&#xff0c;一个名为 UnoCSS 的新星正以其惊人的性能和极致的灵活性迅速崛起。 这篇文章将深入探讨这两款工具的核心理念、技术差…...

【工具教程】多个条形码识别用条码内容对图片重命名,批量PDF条形码识别后用条码内容批量改名,使用教程及注意事项

一、条形码识别改名使用教程 打开软件并选择处理模式&#xff1a;打开软件后&#xff0c;根据要处理的文件类型&#xff0c;选择 “图片识别模式” 或 “PDF 识别模式”。如果是处理包含条形码的 PDF 文件&#xff0c;就选择 “PDF 识别模式”&#xff1b;若是处理图片文件&…...

篇章一 论坛系统——前置知识

目录 1.软件开发 1.1 软件的生命周期 1.2 面向对象 1.3 CS、BS架构 1.CS架构​编辑 2.BS架构 1.4 软件需求 1.需求分类 2.需求获取 1.5 需求分析 1. 工作内容 1.6 面向对象分析 1.OOA的任务 2.统一建模语言UML 3. 用例模型 3.1 用例图的元素 3.2 建立用例模型 …...