雷锋网按:本文为AI研习社编译的技术博客,原标题 Understanding Python Dataclasses — Part 2 ,作者为 Shikhar Chauhan 。
翻译 | 程添杰 整理 | MY
我们已经知道 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 造成麻烦。
考虑以下的使用情形:你有一个数据类用于存放用户的信息。现在,它可能存在以下字段:
姓名
年龄
身高
体重
......
领取专属 10元无门槛券
私享最新 技术干货