Python使用attr库打造数据类,你还在手写构造函数吗?


1、attr库基础介绍 🛠️

1.1 attr安装与导入

在Python中,attr库是一个简化创建数据类的工具 ,它通过简洁的语法自动添加属性和方法 ,如getter、setter等。要开始使用attr,首先需要通过pip安装这个库。打开终端或命令提示符,运行以下命令进行安装:

pip install attrs

安装完成后 ,在你的Python脚本或交互式环境中 ,可以通过标准的import语句导入attr模块:

import attr

1.2 数据类的定义与使用

使用attr定义一个数据类非常直观。下面是一个简单的例子,展示如何定义一个包含姓名和年龄属性的Person类,并通过@attr.s装饰器来自动管理属性:

@attr.s
class Person:
    name:str= attr.ib()
    age:int= attr.ib()# 创建Person实例
person_instance =Person("Alice",30)# 访问属性
print(person_instance.name)# 输出: Alice
print(person_instance.age)   # 输出: 30

这里,@attr.s装饰器替代了传统的__init__方法,而attr.ib()用于声明类的属性及其类型注解。这样的定义方式使得代码更简洁 ,同时保留了静态类型检查的好处。

通过上述介绍,我们已经掌握了attr的基本安装和使用方法,为深入探索其高级特性和实际应用打下了基础。接下来 ,你可以尝试在自己的项目中使用attr来简化数据类的编写 ,提升开发效率。

2、attr装饰器魔法 🎩

2.1 @attr.s的深入理解

@attr.sattrs库中最核心的装饰器,它能够自动为类生成构造函数、getter和setter方法,以及__repr____eq__等特殊方法。这极大地简化了数据类的定义过程,使代码更加简洁且易于维护。让我们通过一个具体的例子来看看@attr.s如何发挥作用:

import attr@attr.s
class Book:
    title:str= attr.ib()
    author:str= attr.ib()
    year:int= attr.ib()# 创建Book实例
book =Book("The Great Gatsby","F. Scott Fitzgerald",1925)# 输出Book实例的信息
print(book)  # 输出: Book(title='The Great Gatsby', author='F. Scott Fitzgerald', year=1925)

在这个例子中 ,我们定义了一个Book类 ,包含了书名、作者和出版年份三个属性。通过@attr.s装饰器,我们无需手动实现构造函数、__repr__方法等,attrs库会自动生成这些方法。

2.2 自动属性与默认值设置

除了基本的属性定义,attrs还允许我们在定义属性时设置默认值,这样可以避免在实例化类时必须传入所有属性值的情况。此外,我们还可以利用attr.ib()的一些特性来定制属性的行为。例如,如果某个属性应该在初始化后不可更改,我们可以使用init=False选项。下面的例子展示了如何在Book类中设置默认值和不可更改的属性:

import attr@attr.s
class Book:
    title:str= attr.ib(default="Unknown Title")
    author:str= attr.ib(default="Unknown Author")
    year:int= attr.ib(default=0)
    _is_bestseller:bool= attr.ib(init=False, default=False)# 创建Book实例,不需传入所有参数
book =Book()# 修改可变属性
book.title ="The Catcher in the Rye"
book.author ="J.D. Salinger"
book.year =1951# 尝试修改不可变属性
try:
    book._is_bestseller =True
exceptAttributeErroras e:
print(e)# 输出: can't set attribute# 输出Book实例的信息
print(book)  # 输出: Book(title='The Catcher in the Rye', author='J.D. Salinger', year=1951)

通过上面的代码片段,我们可以看到attrs库不仅简化了数据类的定义 ,还提供了丰富的定制选项,帮助开发者根据具体需求灵活地管理类的属性和行为。这种灵活性和易用性使得attrs成为Python开发者在处理数据结构时的强大助手。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/361082.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024软件设计师笔记之考点版(一考就过):11-25

软件设计师之一考就过:成绩版 考点11:防火墙、入侵检测 真题1:(专家系统、模型检测、简单匹配)属于入侵检测;而漏洞扫描不属于。 真题2:防火墙特性包括(控制进出网络的数据包和数据流向、提供流量信息的日志和审计、隐藏内部IP以及网络结构细节),但不包括提供漏洞扫…

「6.25更新日志」JVS·智能BI、逻辑引擎(服务编排)功能更新说明

项目介绍 JVS是企业级数字化服务构建的基础脚手架,主要解决企业信息化项目交付难、实施效率低、开发成本高的问题,采用微服务配置化的方式,提供了 低代码数据分析物联网的核心能力产品,并构建了协同办公、企业常用的管理工具等&am…

AttributeError: module ‘numpy‘ has no attribute ‘long‘

我使用的numpy版本是1.26.4。numpy.long在numpy 1.20就不维护了,numpy 1.24就移除掉了,因此解决方案之一就是重新安装numpy 或者,ctrl鼠标左键定位到报错的地方,将numpy.long改为numpy.longlong。 https://numpy.org/devdocs/rele…

NetSuite Account Merge 科目合并功能分析

最近项目中,客户有提到过能否将不用的Account与新建的Account进行合并,即我们所说的Merge功能~可以,但是该功能有使用的限制,比如最直接的一点需要注意,不同类型的Account是不可以使用Merge功能的&#xff…

mysql数据库中使用存储过程带来的好处和示例(存储过程的概念、定义、作用等详解)

目录 一、概述 二、存储过程的作用 1、代码重用 2、简化复杂操作 3、提高性能 4、安全性和数据完整性 三、相对于sql操纵语句(select、insert等)存储过程的好处 1、代码重用和封装 (1)概述 (2)举…

红酒舞动,运动风采,品味力与美

当夜幕降临,城市的灯火渐次亮起,忙碌了一天的人们开始寻找那份属于自己的宁静与愉悦。在这个时刻,红酒与运动,这两个看似截然不同的元素,却能以它们不同的魅力,为我们带来一场视觉与感官的盛宴。 红酒&…

多供应商食品零售商城系统的会员营销设计和实现

在多供应商食品零售商城系统中,会员营销是提升用户粘性和增加销售的重要手段。一个有效的会员营销系统能够帮助平台更好地了解用户需求,提供个性化服务,进而提高用户满意度和忠诚度。本文将详细探讨多供应商食品零售商城系统的会员营销设计与…

四川赤橙宏海商务信息咨询有限公司一站式抖音电商服务

在数字化浪潮汹涌的当下,电商行业正以前所未有的速度发展,而抖音电商作为其中的佼佼者,更是吸引了无数商家和消费者的目光。在这个充满机遇与挑战的市场中,四川赤橙宏海商务信息咨询有限公司凭借其专业的服务和丰富的经验&#xf…

免费资源推荐丨维普OA期刊服务:OA传播 可在线阅读,可下载PDF

《OA传播(Communication based on Open Access,CBOA)》数据库 产品介绍 OA传播(Communication based on Open Access,CBOA)由重庆非晓数据科技有限公司(重庆维普资讯有限公司子公司)出品,是以服务全球科学研究与技术创新为宗旨的OA学术文献一站式免费检索、下载、传…

背包模型——AcWing 423. 采药

背包模型 定义 背包模型是一种常见的算法问题模型,它主要涉及将一些物品放入一个容量有限的背包中,以达到某种最优目标,如最大化价值或最小化重量等。 运用情况 常用于资源分配、项目选择、货物装载等实际问题中。例如,在选择…

深圳比创达EMC|EMC与EMI滤波器:在电子设备中的平衡之道

随着科技的快速发展,电子设备已经深入到我们生活的方方面面,从家用电器到工业设备,从通信设备到医疗仪器,都离不开电子技术的支持。然而,电子设备在带来便利的同时,也面临着电磁兼容(EMC&#x…

照片变漫画怎么弄?这5个照片变漫画方法超简单

在艺术和社交融合的现在,将照片转换为漫画风格已经成为一种流行趋势。 无论是为了创造个性化的头像,还是制作有趣的社交媒体帖子,拥有一款能够将照片转换为漫画的软件将极大地丰富你的创意表达。 下面,本文将介绍几款能够实现这…

【浦语开源】深入探索:大模型全链路开源组件 InternLM Lagent,打造灵笔Demo实战指南

一、准备工作: 1、环境配置: pip、conda换源: pip临时换源: pip install -i https://mirrors.cernet.edu.cn/pypi/web/simple some-package# 这里的“https://mirrors.cernet.edu.cn/pypi/web/simple”是所换的源,…

TDengine 推出新连接器,与 Wonderware Historian 无缝连接

在最新发布的TDengine 3.2.3.0 版本中,我们进一步更新了 TDengine 的数据接入功能,推出了一款新的连接器,旨在实现 Wonderware Historian(现称为 AVEVA Historian)与 TDengine 的集成。这一更新提供了更加便捷和高效的…

什么是钢直尺“光学影像式”仪器校准方法?

计量和我们生活密不可分,但是对于计量的了解大多数人并不深入,因此也会存在一些认知上的误差。比如一个体温计买来才几十块,但是做一次校准费用就是一两百。又或者是一把钢直尺才十几块成本,校准的费用却是成本的三到四倍。 不了…

选择诊所管理系统的原则是什么?

如今,诊所管理系统已成为医疗机构提升管理效率、优化患者服务的重要工具。然而,市场上的诊所管理系统琳琅满目,功能各异,因此,如何选择一款适合自己诊所的管理系统,是许多诊所管理者需要思考的问题。下面&a…

SpringBoot-在配置文件中使用Profile

Profile,译为“配置文件” 在这里的Spring Boot也是一样,我们可以配置很多个Profile,每个Profile都对应一整个完整的全局配置,激活哪个,那个对应的全局配置就生效,具体的配置: 1、properties格…

[leetcode]number-of-longest-increasing-subsequence

. - 力扣&#xff08;LeetCode&#xff09; class Solution { public:int findNumberOfLIS(vector<int> &nums) {int n nums.size(), maxLen 0, ans 0;vector<int> dp(n), cnt(n);for (int i 0; i < n; i) {dp[i] 1;cnt[i] 1;for (int j 0; j < i…

操作系统入门 -- 内存管理

操作系统入门 – 内存管理 1.内存种类 1.1 虚拟内存&#xff08;VIRT&#xff09; 进程需要的虚拟内存大小&#xff0c;包括进程使用的库、代码、数据以及malloc、new分配的堆空间和栈空间等。若进程申请了10MB内存但实际使用了1MB&#xff0c;则物理空间会增长10MB。 1.2 …

【MySQL连接器(Python)指南】06-连接器连接参数

文章目录 前言连接器连接参数总结前言 MySQL连接器(Python),用于让Python程序能够访问MySQL数据库。要想让Python应用程序正确高效地使用MySQL数据,就需要深入了解MySQL连接器的特性和使用方法。 上篇文章👉《【MySQL连接器(Python)指南】05-通过连接器操作MySQL数据库》 …