Python 数据类:现代语法下的数据管理利器
Python 数据类是加了 @dataclass 装饰器的普通类,专为存数据而生。Python 3.7+ 通过内置 dataclasses 模块提供。相较普通类有多项优势,本文逐一拆解并附示例与常用操作。
目录
数据类优势
极简代码量
@dataclass 装饰器零可见代码注入大量功能:自动生成 __init__、__repr__、__eq__ 等。只需声明字段,无需手写任何方法。
开箱即用的比较
两数据类实例可直接用 == 比较,因自动实现 __eq__。凡实现此魔术方法的对象均可同类型比较。
友好打印
自动实现 __repr__,print 直接输出结构化表示,调试极便利。
强制类型注解
数据类建立在 Python 新类型系统之上。类型提示降低 Bug 与意外行为。本质是声明变量应存何种类型数据。
数据类示例
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 默认为红桃 Q:
from dataclasses import dataclass
@dataclass
class Card:
rank: str = 'Q'
suit: str = 'hearts'
数据类转 JSON
常见需求:导出数据类为 JSON(入库/发前端)。坏消息:标准库无直转方法。好消息:dataclasses-json 包一键解决,需额外装饰器。装包:
$ 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"}
另一种路子:继承 JSONEncoder 写自定义编码器,无需外部依赖。详见拙作《如何在 Python 中返回多个值》。
持续学习
attrs包提供原生数据类的进阶版- Python 官方文档
- 本站《如何在 Python 中返回多个值》
Python