为什么要用 @dataclass
在阅读 python 代码的时候, 我们时不时会看到 @dataclass
这个装饰器.
它使用起来很方便, 但是你有没有思考过其中的设计思路呢, 今天我们来探索一下 dataclass
是如何从众提案中脱颖而出的.
一个更紧凑的数据类
dataclass
本身是为了寻找一种能够方便存放数据的结构, 而通过 class
定义完整的类过于臃肿.
例如我们希望有一个容器来保存 Student
相关的数据, 可以定义一个这样的类
1 | class Student: |
但是这样写会显得很累赘, 毕竟我们只是想要一个可以用 dot operation 获取内容的容器. 结果却定义了一个完整的 class
.
显然这样的代码不符合 Pythonic 的理念, 而通过 dataclass
则可以让代码更加简洁.
1 |
|
这样在保留 class
的大部分特性的同时, 保证了代码的紧凑.
其他方案
值得注意的是, 社区内提出了各种的方案尝试解决这个问题, 并不只有 dataclass
唯一的方案.
例如在 collections
中提供了 namedtuple
, 可以访问 named attributes.
1 | from collections import namedtuple |
但是根据 PEP 0557 中对于 Why not just use namedtuple 的讨论, 我们可以知道 namedtuple
存在诸多不足.
例如通过 namedtuple
定义的 Point3D(2017, 6, 2) == Date(2017, 6, 2)
, 而 dataclass
能够使得不属于同一 class
的实例无法直接用数值判断是否相等.
虽然通过 PEP-557 我们了解到了 dataclass
相对于其他几种解决方案的优势, 并且最终被广泛接受.
然而还是应该对 dataclass
之外的其他方案保持开放的心态.