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

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

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

• 变量名

• 数据类型

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

复合初始化

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

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

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

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

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

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

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

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

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

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

• 姓名

• 年龄

• 身高

• 体重

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

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

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

下面是具体步骤:

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

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

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

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

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

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

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

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

从初始化中省略字段

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

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

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

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

总结

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

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

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

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

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

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

  1. python中numpy数组的合并_基于Python中numpy数组的合并实例讲解

    基于Python中numpy数组的合并实例讲解 Python中numpy数组的合并有很多方法,如 - np.append() - np.concatenate() - np.stack() - np. ...

  2. python中调用是什么意思_在Python中调用函数的含义?

    因为Dense(-)返回一个可调用的(基本上是一个函数),所以可以依次调用它.这是一个简单的例子: def make_adder(a): def the_adder(b): return a + b ...

  3. python中for语句的使用_对Python中for复合语句的使用示例讲解

    当Python中用到双重for循环设计的时候我一般会使用循环的嵌套,但是在Python中其实还存在另一种技巧--for复合语句. 简单写一个小程序,用于延时循环嵌套功能如下: #!/usr/bin/p ...

  4. python中raw是什么意思_对于Python中RawString的理解

    对于Python中RawString的理解 发布于 2016-01-11 06:56:27 | 100 次阅读 | 评论: 0 | 来源: PHPERZ Python编程语言Python 是一种面向对 ...

  5. python中的静态方法如何调用_关于Python中如何使用静态、类、抽象方法的权威指南(译)...

    对于Python中静态.类.抽象方法的使用,我是一直很迷糊的.最近看到一篇技术文章对这方面解释的很好,在此翻译一下,加深印象,也为有需要的同学提供一个方便. Python中方法是如何工作的: 方法即函 ...

  6. python中怎样使用re模块_[转]Python中RE模块的应用

    Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式.Python 1.5之前版本则是通过 regex 模块提供 Emecs 风格的模式.Emacs 风格模式可读性稍差 ...

  7. 关于python中lambda函数的描述_关于Python中的lambda函数

    lambda是Python编程语言中使用频率较高的一个关键字.那么,什么是lambda?它有哪些用法?网上的文章汗牛充栋,可是把这个讲透的文章却不多.这里,我们通过阅读各方资料,总结了关于Python ...

  8. python中for循环语句格式_关于Python中的for循环控制语句

    #第一个:求 50 - 100 之间的质数 import math for i in range(50, 100 + 1): for j in range(2, int(math.sqrt(i)) + ...

  9. python中if语句的实例_对python中if语句的真假判断实例详解

    说明 在python中,if作为条件语句,当if后面的条件参数为真时,则执行后面的语句块,反之跳过,为了深入理解if语句,我们需要知道if语句的真假判断方式. 示例 在python交互器中,经过测试发 ...

  10. python中递归函数的基例_详谈Python基础之内置函数和递归 Python递归和循环的区别...

    Python 递归函数基例 2. 关于递归函数基例的说明,以下选项中错误的是 A 递归函数的基例决定所谓基例就是不需要递归就能求解的,一般来说是问题的最小规模下的解. 例如:斐波那契数列递归,f(n) ...

最新文章

  1. 【Python】【入门】一文带你掌握Python27入门 ~
  2. ios nslinkattributename 自定义url_iOS音视频播放指南(二)
  3. ajax 实时进度_如何做好项目进度管理?
  4. 精通ASP.NET MVC ——模型验证
  5. 汇编怎么从内存地址写入连续的数字_汇编语言 第一章 基础知识
  6. 【算法】剑指 Offer 61. 扑克牌中的顺子 【重刷】
  7. 谁说大龄程序员不能学 Java?
  8. 大道至简第二篇阅读笔记
  9. 【Java基础-Java运算符】
  10. 解决Android Studio出现Failed to open zip file. Gradle's dependency cache may be corrupt的问题
  11. Atitit 爬虫 node版 attilax
  12. JavaScript 获取网络时间(非本机时间)
  13. linux bzip2压缩文件,linux bzip2命令压缩或解压缩bzip2文件
  14. 【C语言】一维数组传参和二维数组传参的总结
  15. 对于ACM竞赛算法分类的整理
  16. 清华大学计算机系人才流失,大量中国人才流失,科研被国外扼住喉咙,清华等8所高校忍不住了...
  17. Jenkins基础:获取Jenkins-Crumb的错误信息与对应方法
  18. linux 下 QT 讯飞语音合成
  19. 厉害了!中国农历算法
  20. inpaint-图像修补算法

热门文章

  1. linux c 内存分配内存,Linuxc - 操作系统内存分配
  2. 4字节 经纬度_java 获取本机经纬度
  3. 谁在窥屏_TheShy直播被窥屏搞怕了,为了防止被窥屏,这个做法绝了
  4. apache缓存清理_深挖 Mybatis 源码:缓存模块
  5. oracle linux6 u盘安装,U盘安装RHEL6
  6. 吞吐量(TPS)、QPS、并发数、响应时间(RT)
  7. 第三章 使用属性升级MyBank
  8. JDBC_设计架构_驱动类加载_建立Connection_效率测试
  9. 20172301 2017-2018-2《程序设计与数据结构》课程总结
  10. _INTSIZEOF