Python 数据类:一种更好的数据存储方式
Python 数据类是具有 @dataclass
的常规 Python 类 装饰师。它是专门为保存数据而创建的。从 Python 3.7 版开始,Python 通过名为 dataclass
的内置模块提供数据类 .与我们将在本文中探讨的常规 Python 类相比,有几个优点。我们还将查看示例代码和您可能希望对数据类执行的一些常见操作。
目录
<导航>- 使用数据类的优势
- Python 数据类示例
- 默认值
- 将数据类转换为 JSON
- 继续学习
使用数据类的优势
为什么要使用数据类而不是常规的 Python 类?首先,让我们看看 Python 数据类必须提供的一些优势。
需要最少的代码
@dataclass
装饰器在不添加任何可见代码的情况下为类添加了很多功能。这使您的数据类非常紧凑,同时仍提供许多有用的功能。您需要做的就是定义保存数据的字段。你不需要定义任何函数。
比较
两个Python数据类可以用==
比较 因为所谓的dunder方法__eq__是自动实现的。一般来说,我们可以将任何实现此特殊方法的 Python 对象与其他相同类型的对象进行比较。
打印数据类
同样,因为 __repr__
实现后,您可以打印数据类并获得它的良好表示。这对调试特别有用。
数据类需要类型提示
数据类是围绕 Python 提供的新(ish)类型系统构建的。使用类型提示可以减少代码中出现错误和意外行为的机会。您基本上声明了应该存储在变量中的数据类型。
Python 数据类示例
下面是一个工作中的数据类示例:
from dataclasses import dataclass @dataclass class Card: rank: str suit: str card1 = Card("Q", "hearts") card2 = Card("Q", "hearts") print(card1 == card2) # True print(card1.rank) # 'Q' print(card1) Card(rank='Q', suit='hearts')
默认值
数据类可以有默认值。分配默认值就像为变量分配值一样简单。例如,要让我们的 Card 类具有红桃皇后的默认值,我们可以这样做:
from dataclasses import dataclass @dataclass class Card: rank: str = 'Q' suit: str = 'hearts'
将数据类转换为 JSON
一个常见的用例是将结构良好的数据类转换为 JSON。例如,如果您想将数据导出到数据库,或将其发送到浏览器。坏消息是:没有将数据类转换为 JSON 的内置方法。
好消息是,有一个名为 dataclasses-json 的 Python 包可以简化任务。但是,它需要一个额外的装饰器。您需要使用 pip install 命令或 Pipenv 之类的命令安装软件包,最好是在虚拟环境中。例如:
$ pip install dataclasses-json
以下是如何使用该包的示例:
from dataclasses import dataclass from dataclasses_json import dataclass_json @dataclass_json @dataclass class Card: rank: str = 'Q' suit: str = 'hearts' card = Card() print(card.to_json())
{"rank": "Q", "suit": "hearts"}
另一种方法是使用 Python 继承并从 JSONEncoder 类继承来创建自己的自定义编码器。这里的优点是您不需要安装外部包。您可以在这篇博文中了解如何执行此操作。
继续学习
- Python attrs 包具有原生 Python 数据类的高级版本
- Python.org 上的官方文档
- 如何在 Python 中返回多个值
Python