理解Python数据类(下)

雷锋网按:本文为AI研习社编译的技术博客,原标题 Understanding Python Dataclasses — Part 2 ,作者为 Shikhar Chauhan 。

翻译 | 程添杰          整理 | MY

理解Python数据类(下)

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

理解Python数据类(下)

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

  • 变量名

  • 数据类型

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

复合初始化

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

理解Python数据类(下)

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

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

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

理解Python数据类(下)

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

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

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

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

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

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

  • 姓名

  • 年龄

  • 身高

  • 体重

……

想要继续阅读,请移步至我们的AI研习社社区:https://club.leiphone.com/page/TextTranslation/751

更多精彩内容尽在 AI 研习社。

不同领域包括计算机视觉,语音语义,区块链,自动驾驶,数据挖掘,智能控制,编程语言等每日更新。

雷锋网(公众号:雷锋网)雷锋网(公众号:雷锋网)


理解Python数据类(下)

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/134344.html

(0)
上一篇 2021年9月1日
下一篇 2021年9月1日

相关推荐

发表回复

登录后才能评论