您正在使用IE低版浏览器,为了您的雷峰网账号安全和更好的产品体验,强烈建议使用更快更安全的浏览器
此为临时链接,仅用于文章预览,将在时失效
人工智能 正文
发私信给AI研习社-译站
发送

0

理解Python数据类(下)

本文作者: AI研习社-译站 2018-08-13 10:29
导语:这是理解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数据类(下)

分享:
相关文章

知情人士

AI研习社(yanxishe.com)译站频道,传播前沿人工智能知识,让语言不再成为学习知识的门槛。(原雷锋字幕组)
当月热门文章
最新文章
请填写申请人资料
姓名
电话
邮箱
微信号
作品链接
个人简介
为了您的账户安全,请验证邮箱
您的邮箱还未验证,完成可获20积分哟!
请验证您的邮箱
立即验证
完善账号信息
您的账号已经绑定,现在您可以设置密码以方便用邮箱登录
立即设置 以后再说