> 文章列表 > python之dataclasses

python之dataclasses

为什么dataclasses模块这么香?让我们一起来舔~

引言:
想当年,我刚开始学Python,看到别人写类的时候,总是要手动写一堆__init__、__repr__这些方法,内心os:"老子不要写这么多代码啊!有没有更懒的办法?"。后来,我邂逅了dataclasses模块,从此打开了新世界的大门,感觉自己一下子从"码农"变成了"码艺家"。

问题1:dataclasses到底能干啥?
解答:
简单概括,dataclasses就是Python给我们的懒人包,让我们少写代码的神器。它主要解决三个痛点:
1. 数据存储:想当个"数据盒子"?dataclasses帮你自动封装。
2. 数据处理:想玩大数据?dataclasses帮你优雅处理。
3. 数据交换:想和其他系统打招呼?dataclasses帮你装箱卸货。

问题2:为啥不用普通类呢?
解答:
普通类就像自己种菜,虽然自由,但费时费力。dataclasses就像去超市买现成的有机蔬菜,不仅省心,还附带各种小赠品:
- 自动生成__init__、__repr__这些基本方法。
- 可以轻松序列化/反序列化。
- 内置数据验证和清理机制。
- 类属性管理更优雅。

问题3:适用场景有哪些?
解答:
1. 配置管理:比如存储各种配置信息,dataclasses帮你保持代码整洁。
2. 数据模型:比如ORM模型,dataclasses是你的得力助手。
3. REST API:dataclasses帮你优雅处理前后端数据转换。
4. 机器学习:dataclasses帮你管理各种模型参数。

问题4:使用注意事项?
解答:
1. 虽然dataclasses很香,但也不是万能药。如果业务逻辑特别复杂,可能需要考虑其他工具。
2. 对于非常底层的性能要求,可能需要手动优化。

整体而言:
dataclasses就像Python给我们的"瑞士军刀",虽然不能解决所有问题,但绝对是日常开发中的利器。用它不仅能提高效率,还能让代码更优雅。不过,就像吃香的喝辣的一样,也要根据实际情况来选择,毕竟"好马配好鞍","好工具配好场景"嘛!

python之dataclasses

一、场景

dataclasses模块提供了一种方便的方法来创建和管理数据对象
它可以帮助开发者更容易地创建简单的类,同时提供了一些实用的功能,例如自动实现__init__()、repr()、eq()等方法。

  • 数据容器:如果您需要一个简单的类来存储一些数据,例如配置信息、用户信息、数据记录等,那么使用dataclass是非常合适的。dataclass可以自动为您生成适当的属性和方法,以便您可以轻松地访问和修改数据。

  • 数据对象:如果您的代码需要处理大量的数据对象,例如在数据分析、机器学习、自然语言处理等地方中,那么使用dataclass可以使代码更加清晰易读,减少手动编写大量的属性和方法的重复性工作。

  • 序列化和反序列化:dataclass可以帮助您更轻松地将对象序列化为JSON、XML等格式,并在需要时将其反序列化。这使得处理不同系统之间的数据交换变得更加容易。

  • 数据验证和清理:在某些情况下,您可能需要在将数据存储到数据库或发送到其他系统之前对其进行验证和清理。使用dataclass可以使这个过程更加简单和可靠。

二、基础用法

from dataclasses import dataclass, field, asdict, astuple
from typing import List, Any@dataclass
class Book:name: strauthor: str# extend: Any = 'hello world'   # 扩展字段 仅做记录publication: str = field(metadata={"description": "出版日期"})num: int = field(default=1, metadata={"description": "数量"})price: float = field(default=0.0, metadata={'currency': 'RMB'})category: List[str] = field(default_factory=list, repr=False, metadata={"description": "图书类别"})def __post_init__(self):# 方法来确保书名的每个单词的首字母都是大写的self.name = self.name.title()self.title = self.name.upper()def is_expensive(self):# 检查一本书是否价格高于100return self.price > 30.0def total_amount(self):return self.price * self.num
  • 如何调用
    book = Book(name="Under the sky", author="sanxian", price=37.82, publication="2022-11-07", category=['武侠', '古风'])
    book = Book(**{"name": "the three body problem", "author": "刘慈欣", "price": 37.82, "publication": "2022-12-23", "category": ['科幻', '悬疑']})
    print(book.name, book.author)
    print(book.title)print(book