行业报告 AI展会 数据标注 标注供求
数据标注数据集
主页 > 大数据 > 正文

理解Python数据类:Dataclass 的特征概述 (上)

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

 

 

这是一个包含两部分的博文:

这一篇是 Dataclass 的特征概述
下一篇是 Dataclass fields 的概述

引言

Dataclasses 是一些适合于存储数据对象(data object)的 Python 类。你可能会问,什么是数据对象?下面是一个并不详尽的用于定义数据对象的特征列表:

•   他们存储并表示特定的数据类型。例如:一个数字。对于那些熟悉对象关系映射(Object Relational Mapping,简称 ORM)的人来说,一个模型实例就是一个数据对象。它表示了一种特定类型的实体。它存储了用于定义或表示那种实体的属性。

•   他们能够被用于和同类型的其他对象进行比较。例如,一个数字可能大于,小于或等于另一个数字。

•   当然数据对象还有更多的特征,但上述内容足以帮助你理解关键部分。

•   为了理解 Dataclases,我们将实现一个简单的类。它能够存储一个数字,并允许我们执行上面提到的各种运算。

首先,我们将使用普通的类,然后我们使用 Dataclasses 来实现相同的结果。

但是在我们开始之前,还是要提一下 Dataclasses 的用法。

Python3.7 提供了一个装饰器 dataclass,用以把一个类转化为 dataclass。

你需要做的就是把类包裹进装饰器里:

 

 

现在,让我们进一步了解 dataclass 的用法,以及它能为我们改变什么。

初始化

 

 

使用 dataclass

 

 

以下是使用了 dataclass 装饰器之后的变化:

1. 不必定义__init__然后再赋值给 self, 装饰器会注意这一点

2.我们用一种更可读的方式定义成员属性,并带有类型提示(type hinting)。我们现在立刻就知道 val 的类型是 int。这种方式当然比通常的定义方法可读性更好。

Python 之道:可读性很重要

也可以定义默认值:

 

 

对象表示是一种对象的字符串表示法,在调试时非常有用。

默认的 Python 对象表示不是非常的有用:

 

 

这种表示法不能给我们对象用途的提示,同时将导致可怕的调试经历。

一种有意义的表示法可以通过在类定义里,添加一种__repr__方法实现。

 

 

现在我们就有了一种有意义的对象表示法:

 

 

dataclass 会自动添加一个__repr__函数,因此我们不必手动实现它了。

 

 

数据比较

通常,数据对象会伴随着相互比较的需要。两个对象'a'和'b'之间通常包含以下的运算:

a < b
a > b
a == b
a >= b
a <= b

在 Python 里,可以通过在类中定义一些方法来实现上述运算。为了保证整篇文章的简洁性,我将只实现 == 和 < 。

通常做法

 

 

使用 dataclass

 

 

就这样。

我们不需要定义__eq__和__lt__方法,因为当我们调用 order = True 时,dataclass 装饰器会自动把他们添加到类定义里。

那么,它是如何做到的呢?

我们已经知道,当你使用 dataclass 时,它在类定义里添加了__eq__和__lt__函数。那么,这些函数具体是如何检查不等性和做比较的呢?

由 dataclass 生成的__eq__函数,会将其属性元组和另一个同类实例的属性元组进行比较。在我们的例子里,自动生成的__eq__函数等价于:

 

 

再看一个更复杂的例子:

我们将要写一个叫 Person 的 dataclass,并存储他们的 name 和 age。

 

 

自动生成的__eq__方法等价于:

 

 

注意这些属性的顺序。他们总是按照在类定义里的排序生成。

类似的,等价的__le__函数将是这样:

 

 

通常,在你需要排序一列数据对象时,会有定义__le__函数的需要。Python 内置的排序函数依赖于比较两个对象:

 

 

原文链接:https://medium.com/mindorks/understanding-python-dataclasses-part-1-c3ccd4355c34

微信公众号

声明:本站部分作品是由网友自主投稿和发布、编辑整理上传,对此类作品本站仅提供交流平台,转载的目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,不为其版权负责。如果您发现网站上有侵犯您的知识产权的作品,请与我们取得联系,我们会及时修改或删除。

网友评论:

发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
SEM推广服务

Copyright©2005-2026 Sykv.com 可思数据 版权所有    京ICP备14056871号

关于我们   免责声明   广告合作   版权声明   联系我们   原创投稿   网站地图  

可思数据 数据标注行业联盟

扫码入群
扫码关注

微信公众号

返回顶部