python中的类怎样理解_理解Python数据类:Dataclass fields 的概述(下)

原标题 Understanding Python Dataclasses?—?Part 2 ,作者为 Shikhar Chauhan 。

crqgbxwpupw.png

这是 Python 最新的 Dataclasses 系列的第二部分内容。在第一部分里,我介绍了 dataclasses 的一般用法。这篇主要介绍另一个特征:dataclasses.field。

3shfpcx5d20.png

我们已经知道 Dataclasses 会生成他们自身的__init__方法。它同时把初始化的值赋给这些字段。以下是我们在上一篇博客里定义的内容:

• 变量名

• 数据类型

这些内容仅给我们有限的 dataclass 字段使用范围。让我们讨论一下这些局限性,以及它们如何通过 dataclass.field 被解决。

复合初始化

考虑以下情形:你想要初始化一个变量为列表。你如何实现它呢?一种简单的方式是使用__post_init__方法。

gem4icx2lwd.png

数据类 Student 产生了一个名为 marks 的列表。我们不传递 marks 的值,而是使用__post_init__方法初始化。这是我们定义的单一属性。此外,我们必须在__post_init__里调用 get_random_marks 函数。这些工作是额外的。

辛运的是,Python 为我们提供了一个解决方案。我们可以使用 dataclasses.field 来定制化 dataclass 字段的行为以及它们在 dataclass 的影响。

仍然是上述的使用情形,让我们从__post_init__里去除 get_random_marks 的调用。以下是使用 dataclasses.field 的情形:

o0su0qyljft.png

dataclasses.field 接受了一个名为 default_factory 的参数,它的作用是:如果在创建对象时没有赋值,则使用该方法初始化该字段。

default_factory 必须是一个可以调用的无参数方法(通常为一个函数)。

这样我们就可以使用复合形式初始化字段。现在,让我们考虑另一个使用场景。

使用全部字段进行数据比较

通过上篇博文,我们了解到,dataclass 能够自动生成< , =, >, <=和>=这些比较方法。但是这些比较方法的一个缺陷是,它们使用类中的所有字段进行比较,而这种情况往往不常见。更经常地,这种比较方法会给我们使用 dataclasses 造成麻烦。

考虑以下的使用情形:你有一个数据类用于存放用户的信息。现在,它可能存在以下字段:

• 姓名

• 年龄

• 身高

• 体重

你仅想比较用户对象的年龄、身高和体重。你不想比较姓名。这是后端开发者经常会遇到的使用情景。

swy0if0vkd5.png

自动生成的比较方法会比较一下的数组:

x0qnfqatoye.png

这将会破坏我们的意图。我们不想让姓名(name)用于比较。那么,如何使用 dataclasses.field 来实现我们的想法呢?

下面是具体步骤:

1vim4xj4uz5.png

默认情况下,所用的字段都用于比较,因此我们仅仅需要指定哪些字段用于比较,而实现方法是直接把不需要的字段定义为 filed(compare=False)。

一个更为简单的应用情形也可以被讨论。让我们定义一个数据类,它被用来存储一个数字激起字符串表示。我们想让比较仅仅发生在该数字的值,而不是他的字符串表示。

52a5pag5pig.png

现在,我们有更大的自由来控制 dataclasses 的行为。看起来很棒!

4jaql5gbaps.png

使用全部字段进行数据表示

自动生成的__repr__方法使用所有的字段用于表示。当然,这也不是大多数情形下的理想选择,尤其是当你的数据类有大量的字段时。单个对象的表示会变得异常臃肿,对调试来说也不利。

yqbxnyztafr.png

想象一下在你的日志里看到这样的表示吧,然后还要写一个正则表达式来搜索它。太可怕了,对吧?

jsha1lxp3zc.png

当然,我们也能够个性化这种行为。考虑一个类似的使用场景,也许最合适的用于表示的属性是姓名(name)。那么对__repr__,我们仅使用它:

e3ia4tsczus.png

这样看起来就很棒了。调试很方便,比较也有意义!

从初始化中省略字段

目前为止我们看到的所有例子,都有一个共同特点——即我们需要为所有被声明的字段传递值,除了有默认值之外。在那种情形下(指有默认值的情况下),我们可以选择传递值,也可以不传递。

xtqp2p2opv5.png

但是,还有一种情形:我们可能不想在初始化时设定某个字段的值。这也是一种常见的使用场景。也许你在追踪一个对象的状态,并且希望它在初始化时一直被设为 False。更一般地,这个值在初始化时不能够被传递。

z5yyguenvxz.png

那么,我们如何实现上述想法呢?以下是具体内容:

wjhthmcbjwh.png

瞧啊!我们现在对 dataclasses 的使用有了更大的灵活性。

总结

希望上两篇博文能够帮助你理解 dataclass,希望你能尽快在项目中使用它们!

原文链接:https://medium.com/mindorks/understanding-python-dataclasses-part-2-660ecc11c9b8

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com

特别注意:本站所有转载文章言论不代表本站观点!

本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。

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

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

相关文章

java 图形处理库_java中处理图片的类库

拷贝一下代码&#xff0c;以后备用&#xff1a;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.PrintWriter;import java.util.ArrayList;import java.util.List;import javax.servlet.ServletException;import javax.servle…

Hibernate @OneToMany等注解设置查询过滤条件等

如实体PdOrg对象中有users对象&#xff0c;数据库user表有字段DEL_FLAG(0&#xff1a;删除&#xff1b;1&#xff1a;未删除)&#xff1a; private List<User> users new ArrayList<User>(); 生成get、set方法&#xff1a; OneToMany(fetchFetchType.LAZY, mappedB…

西部数码域名解析到阿里云_西部数码云主机好吗 稳定性如何

随着云计算技术的不断发展&#xff0c;我国云计算市场的经济效益也在日渐扩大&#xff0c;各个云服务商之间的竞争异常激烈。在这种环境下&#xff0c;备受人们关注的云服务企业主要呈现两大类&#xff0c;一是互联网巨头背景的阿里云、腾讯云等&#xff1b;二是以西部数码为代…

ffmpeg yasm not found, use --disable-yasm for a crippled build

yasm是汇编编译器&#xff0c;因为ffmpeg中为了提高效率用到了汇编指令&#xff0c;比如MMX和SSE。解决这个问题方面有两个&#xff1a;1、在网上下载一个yasm.exe并安装在mingw/bin下面&#xff0c;编译代码时你注意看&#xff0c;会发现asm后缀的文件用的编译器是yasm&#x…

java native 接口_Java本地接口--Java Native Interface (JNI)

一、方法介绍java native方法是指本地方法&#xff0c;当在方法中调用一些不是由java语言写的代码或者在方法中用java语言直接操纵计算机硬件时要声明为native方法。java中&#xff0c;通过JNI(Java Native Interface,java本地接口)来实现本地化。Native方法一般用于两种情况&a…

【转】android程序连接网络出现android.os.NetworkOnMainThreadExceptionat

错误&#xff1a; android.os.NetworkOnMainThreadException at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099) ...... 原因&#xff1a;是涉及到url操作的时候&#xff0c;访问网络不能在主程序中运行 解决&#xff1a;参考【http://geeksu…

mysql8.0.22安装步骤图解_MySQL server 5.5的安装 步骤图解

作者&#xff1a;极客小俊 一个专注于web技术的80后我不用拼过聪明人&#xff0c;我只需要拼过那些懒人 我就一定会超越大部分人!知乎极客小俊&#xff0c;官方首发原创文章还有人用老版本的mysql 5.5吗&#xff1f;&#xff1f; 如果有的话 并且不会安装的小白看下面的步骤图吧…

win7下ffmpeg编译动态链接库整理

1.写在ffmpeg编译前 关于ffmpeg的编译过程google一搜&#xff0c;一大堆&#xff0c;ffmpeg编译真的有那么难么&#xff1f;在我编译成功后回头来看&#xff0c;网上的资料过多&#xff0c;反而使自己走了很多的弯路。即便有些楼主亲自测试后编译成功了&#xff0c;由于受机器…

inputstream java_Java实现inputstream流的复制

获取到一个inputstream后&#xff0c;可能要多次利用它进行read的操作。由于流读过一次就不能再读了&#xff0c;而InputStream对象本身不能复制&#xff0c;而且它也没有实现Cloneable接口&#xff0c;所以得想点办法。实现思路&#xff1a;1、先把InputStream转化成ByteArray…

wzctool工具使用详解

Wzctool是WinCE一个比较小巧实用的无线Wifi配置小工具&#xff0c;借助命令行调用该程序能够非常简单地设置wifi的相应参数&#xff0c;能够在一定程度上避免书写代码的繁琐之举。 这个工具是在编译系统的时候&#xff0c;添加Wifi组件后自动生成的。如果用户直接进到Platform…

spring boot 入门_玩转springboot2.x之快速入门开山篇

Spring Boot简介Spring Boot的目的在于创建和启动新的基于Spring框架的项目。Spring Boot会选择最适合的Spring子项目和第三方开源库进行整合。大部分Spring Boot应用只需要非常少的配置就可以快速运行起来。Spring Boot是伴随着Spring4.0诞生的&#xff0c;旨在简化开发。Spri…

详细介绍Qt,ffmpeg 和SDl 教程之间的联系

Qt与 ffmpeg 与 SDl 教程是本文要介绍的内容&#xff0c;从多个角度介绍本文&#xff0c;运用了qmake&#xff0c;先来看内容。1. 注释 从“ #” 开始&#xff0c;到这一行结束。2. 指定源文件 1. SOURCES *.cpp 对于多源文件&#xff0c;可用空格分开&#xff…

如何生成JAR包

JDK中自带了jar命令&#xff0c;可以生成jar包&#xff0c;在命令行输入jar可以看到用法。 E:\20121008>jar用法: jar {ctxui}[vfm0Me] [jar-file] [manifest-file] [entry-point] [-C dir] files ...选项包括&#xff1a; -c 创建新的归档文件 -t 列出归档目录 …

java 匿名内部类 百科_java匿名内部类具体概念是什么,在什么地方用到?

展开全部java匿名内部类一定是在new的后面&#xff0c;用其隐含实现一个接口或实现一个类&#xff0c;没有类名&#xff0c;根据多态&#xff0c;我们e69da5e887aa62616964757a686964616f31333337613863使用其父类名。因他是局部内部类&#xff0c;那么局部内部类的所有限制都对…

python 元组 列表 字典区别_python编程:常用的数据结构之字典的方法总结,和列表和元组区别...

字典是一种键&#xff1a;值的形式&#xff0c;我们前面分享的文章学习了列表[],元祖&#xff08;&#xff09;&#xff0c;字典是由{}引起来的&#xff0c;列表的键对应的是列表的下标&#xff0c;而字典的值对应的是字典的键&#xff0c;我们可以通过字典的键来获取字典的值 …

ubuntu11.10中配置OGRE1.8

在这里提到的版本有点低&#xff0c;但对于Ubuntu11.10Ogre1.8照样适用。 对于Ubuntu 9.10及以上版本&#xff1a; 安装编译器及配置工具&#xff1a; sudo apt-get install build-essential automake libto 安装必须的依赖&#xff1a; sudo apt-get install libfreetype6-dev…

java 录音_用JAVA实现不限时录音功能

在网上找了个录音软件&#xff0c;而且这个软件是根据手机里剩余内存的大小&#xff0c;可以进行不限时录音&#xff0c;所以特地拿上来和大家分享&#xff01;这个JAVA软件我发到了“玩转手机”里。解压缩后&#xff0c;大家可以用MIDway_2.8中文&#xff0c;通过数据线上传到…

MinGw+Msys搭建环境 编译ffmpeg

MinGW:一个可自由使用和自由发布的Windows特定头文件和使用GNC工具集导入库的集合&#xff0c;允许你生成本地的Windows程序而不需要第三方C运行时 MinGW&#xff0c;即 Minimalist GNU For Windows。它是一些头文件和端口库的集合&#xff0c;该集合允许人们在没有第三方动态链…

redis 多线程_唬人的Redis多线程,也就那么回事

不羡鸳鸯不羡仙&#xff0c;一行代码调半天。原创&#xff1a;小姐姐味道&#xff08;微信公众号ID&#xff1a;xjjdog&#xff09;&#xff0c;欢迎分享&#xff0c;转载请保留出处。周末被一位小同学憋的很窝火。 他要和我探讨一下&#xff0c;redis到底是多线程的还是单线程…

关于客户端无法获得服务器端GP服务(Geoprocessing Service)结果的解决办法

之前发布了一个绘制等值面的服务&#xff0c;在本机测试的时候始终都可以访问&#xff0c;没有任何的问题&#xff0c;但是在远程访问时&#xff0c;出现了无法获得GP服务结果(注&#xff1a;结果为图片)的问题&#xff0c;而在服务器端确实生成了正确的结果。困扰了很久之后&a…