当前位置: 首页 > news >正文

[python] dataclass 快速创建数据类

在Python中,dataclass是一种用于快速创建数据类的装饰器和工具。自Python 3.7起,通过标准库中的dataclasses模块引入。它的主要目的是简化定义类来仅存储数据的代码量。通常,这样的类包含多个初始化属性,但没有复杂的方法(尽管你可以添加方法)。使用dataclass装饰器,Python会自动为你生成一些特殊方法,如__init__()、__repr__()、__eq__()等。

定义数据类

from dataclasses import dataclass, asdict
import json@dataclass
class Address:street: strcity: str@dataclass
class User:name: strage: intemail: straddress: Address  # User 包含一个 Address 类型的属性

转换为JSON

由于Address也是一个@dataclass,使用asdict()User实例转换为字典时,Address实例也会被递归地转换为字典。因此,整个转换过程相对直接:

user = User(name="John Doe", age=30, email="john.doe@example.com",address=Address(street="123 Elm Street", city="Gotham"))# 将数据类实例转换为字典,包括嵌套的数据类
user_dict = asdict(user)# 将字典转换为JSON字符串
user_json = json.dumps(user_dict)print(user_json)

处理复杂或特殊类型

如果你的数据类包含不能直接被json.dumps()处理的复杂或特殊类型(如日期时间对象),你可以通过提供一个自定义的处理函数给json.dumps()default参数来解决这个问题。例如,如果User包含一个datetime类型的生日属性,你可以这样做:

from datetime import datetime@dataclass
class User:name: strage: intemail: straddress: Addressbirthday: datetime  # 假设我们添加了一个 datetime 类型的属性def datetime_converter(o):if isinstance(o, datetime):return o.__str__()user = User(name="John Doe", age=30, email="john.doe@example.com",address=Address(street="123 Elm Street", city="Gotham"),birthday=datetime(1990, 1, 1))user_dict = asdict(user)# 使用 default 参数处理 datetime 对象
user_json = json.dumps(user_dict, default=datetime_converter)print(user_json)

通过这种方式,你可以灵活地将包含嵌套@dataclass属性甚至更复杂类型的数据类实例转换成JSON格式。

文章目录

      • 定义数据类
      • 转换为JSON
      • 处理复杂或特殊类型
      • `dataclasses`模块中的重要函数
      • 示例
      • `Field`对象
      • 使用`fields()`函数的示例

dataclasses模块中的重要函数

除了自动生成的方法外,dataclasses模块还提供了一些有用的函数来处理数据类:

  1. fields(class_or_instance)
    返回一个包含数据类的所有Field对象的元组,每个Field对象包含关于字段的信息,如名称、类型和默认值。

  2. asdict(instance, *, dict_factory=dict)
    将数据类实例转换为字典。这对于将数据类实例序列化为JSON非常有用。

  3. astuple(instance, *, tuple_factory=tuple)
    将数据类实例转换为元组。这在需要将数据类实例与其他基于元组的APIs交互时很有用。

  4. is_dataclass(obj)
    检查一个对象是否是数据类或其实例。

  5. replace(instance, **changes)
    创建一个新的数据类实例,其中包含通过changes指定的字段值更改。这在frozen=True(即不可变数据类)的情况下特别有用,因为你不能直接修改字段值。

示例

from dataclasses import dataclass, asdict, astuple, replace@dataclass
class Point:x: inty: intp = Point(10, 20)
print(p)  # 输出: Point(x=10, y=20)p_dict = asdict(p)
print(p_dict)  # 输出: {'x': 10, 'y': 20}p_tuple = astuple(p)
print(p_tuple)  # 输出: (10, 20)p_new = replace(p, x=100)
print(p_new)  # 输出: Point(x=100, y=20)

通过使用dataclass,Python程序员可以更加专注于数据的逻辑,而不是编写重复的方法代码,大大提高了开发效率和代码的可读性。

Field对象

Field对象是dataclasses模块定义的一个类,它包含以下主要属性:

  • name:字符串,字段的名称。
  • type:字段的类型,使用类型注解指定。
  • default:字段的默认值。如果字段没有默认值,则此属性为dataclasses._MISSING_TYPE
  • default_factory:用于生成字段默认值的工厂函数。如果字段没有默认工厂,则此属性为dataclasses._MISSING_TYPE
  • init:一个布尔值,指示是否在自动生成的__init__方法中包含该字段。
  • repr:一个布尔值,指示是否在自动生成的__repr__方法中包含该字段。
  • compare:一个布尔值,指示是否在比较方法中包含该字段(如__eq__)。
  • hash:一个布尔值或None,指示是否在计算哈希值时包含该字段。
  • metadata:一个映射,包含字段的元数据。这是在定义字段时通过metadata参数传递的任意字典。

使用fields()函数的示例

from dataclasses import dataclass, field, fields@dataclass
class Person:name: strage: int = field(default=18, metadata={"description": "Age of the person"})is_student: bool = False# 获取Person数据类的字段信息
for f in fields(Person):print(f"name={f.name}, type={f.type}, default={f.default}, metadata={f.metadata}")# 输出示例:
# name=name, type=<class 'str'>, default=<dataclasses._MISSING_TYPE object at 0x...>, metadata={}
# name=age, type=<class 'int'>, default=18, metadata={'description': 'Age of the person'}
# name=is_student, type=<class 'bool'>, default=False, metadata={}

在这个示例中,我们定义了一个Person数据类,并使用fields()函数遍历其字段,打印出每个字段的名称、类型、默认值和元数据。这种方式特别有用于动态地处理数据类字段,例如在序列化或验证场景中。

相关文章:

[python] dataclass 快速创建数据类

在Python中&#xff0c;dataclass是一种用于快速创建数据类的装饰器和工具。自Python 3.7起&#xff0c;通过标准库中的dataclasses模块引入。它的主要目的是简化定义类来仅存储数据的代码量。通常&#xff0c;这样的类包含多个初始化属性&#xff0c;但没有复杂的方法&#xf…...

opencv实现图像的融合

实现图像的融合并且输出一张jpg格式的照片。 先显示一个彩色图的照片 然后我以彩色方式读取1.png&#xff0c;以灰度图方式读取3.png这张图片&#xff0c;并且用两个窗口独立地去显示(我后来发现不能把灰度图和彩色图相融合) 然后实现两个融合 #include <opencv2/highgu…...

Orbit 使用指南 02 | 在场景中生成原始对象| Isaac Sim | Omniverse

如是我闻&#xff1a; Orbit使用指南02将 深入探讨如何使用Python代码在Orbit中向场景生成各种对象&#xff08;或原始对象&#xff09;。一起探索如何生成地面平面、灯光、基本图形形状以及来自USD文件的网格。前置知识&#xff1a;如何生成空白场景&#xff0c;Orbit 使用指…...

【2024】利用python爬取csdn的博客用于迁移到hexo,hugo,wordpress...

前言 博主根据前两篇博客进行改进和升级 利用python爬取本站的所有博客链接-CSDN博客文章浏览阅读955次&#xff0c;点赞6次&#xff0c;收藏19次。定义一个json配置文件方便管理现在文件只有用户名称,后续可加配置读取用户名称&#xff0c;并且将其拼接成csdn个人博客链接ty…...

从嵌入式Linux到嵌入式Android

最近开始投入Android的怀抱。说来惭愧&#xff0c;08年就听说这东西&#xff0c;当时也有同事投入去看&#xff0c;因为恶心Java&#xff0c;始终对这玩意无感&#xff0c;没想到现在不会这个嵌入式都快要没法搞了。为了不中年失业&#xff0c;所以只能回过头又来学。 首先还是…...

蓝桥ACM培训-实战1

前言&#xff1a; 今天老师没讲课&#xff0c;只让我们做了一下几道题目。 正文&#xff1a; Problem:A 小蓝与操作序列&#xff1a; #include<bits/stdc.h> using namespace std; stack<int> a; int main(){int n,flag1,ans;string cz;cin>>n;for(int i1;…...

波动数列(蓝桥杯)

问题描述&#xff1a; 观察如下数列&#xff1a; 1 3 0 2 -1 1 -2 … 这个数列中后一项总是比前一项增加 2 或者减少 3。 栋栋对这种数列很好奇&#xff0c;他想知道长度为 n nn 和为 s ss 而且后一项总是比前一项增加 a aa 或者减少 b bb 的整数数列可能有多少种呢&#xff1f…...

第二篇【传奇开心果系列】Python的自动化办公库技术点案例示例:深度解读Pandas金融数据分析

传奇开心果博文系列 系列博文目录Python的自动化办公库技术点案例示例系列 博文目录前言一、Pandas 在金融数据分析中的常见用途和功能介绍二、金融数据清洗和准备示例代码三、金融数据索引和选择示例代码四、金融数据时间序列分析示例代码五、金融数据可视化示例代码六、金融数…...

Flink:Temporal Table Function(时态表函数)和 Temporal Join

博主历时三年精心创作的《大数据平台架构与原型实现&#xff1a;数据中台建设实战》一书现已由知名IT图书品牌电子工业出版社博文视点出版发行&#xff0c;点击《重磅推荐&#xff1a;建大数据平台太难了&#xff01;给我发个工程原型吧&#xff01;》了解图书详情&#xff0c;…...

Go语言中的时间控制:定时器技术详细指南

Go语言中的时间控制&#xff1a;定时器技术详细指南 引言定时器基础创建和使用time.Timer使用time.Ticker实现周期性任务定时器的内部机制小结 使用time.Timer实现简单的定时任务创建和启动定时器停止和重置定时器定时器的实际应用小结 利用time.Ticker处理重复的定时任务创建和…...

面试笔记系列六之redis+kafka+zookeeper基础知识点整理及常见面试题

目录 Redis redis持久化机制&#xff1a;RDB和AOF Redis 持久化 RDB的优点 RDB的缺点 AOF 优点 AOF 缺点 4.X版本的整合策略 Redis做分布式锁用什么命令&#xff1f; Redis做分布式锁死锁有哪些情况&#xff0c;如何解决&#xff1f; Redis如何做分布式锁&#xff1f…...

Golang动态高效JSON解析技巧

JSON如今广泛用于配置和通信协议&#xff0c;但由于其定义的灵活性&#xff0c;很容易传递错误数据。本文介绍了如何使用mapstructure工具实现动态灵活的JSON数据解析&#xff0c;在牺牲一定性能的前提下&#xff0c;有效提升开发效率和容错能力。原文: Efficient JSON Data Ha…...

双重检验锁

双重检验锁&#xff1a;设计模式中的单例模式&#xff0c;细分为单例模式中的懒加载模式。 单例模式 单例模式&#xff1a;指的是一个类只有一个对象。最简单的实现方式是设一个枚举类&#xff0c;只有一个对象。缺点是当对象还没有被使用时&#xff0c;对象就已经创建存在了…...

【RISC-V 指令集】RISC-V DSP 扩展指令集介绍(一)

前言&#xff1a; 本笔记是基于对RISC-V DSP扩展指令集文档总结的&#xff0c;《P-ext-proposal.pdf》文档的关键内容如下&#xff1a; 主要介绍了RISC-V的P扩展指令集及其相关细节。 首先&#xff0c;对P扩展指令进行了概述&#xff0c;并列出了其与其他扩展重复的指令。 …...

RocketMQ - CentOS 7.x 安装单机版并测试

【安装前环境准备】检查是否安装好JDK(必要)&#xff1a;java -version查看CPU信息&#xff1a; # cat /proc/cpuinfo # lscpu # getconf _NPROCESSORS_ONLN # cat /sys/devices/system/cpu/online # cat /proc/interrupts | egrep -i cpu查看内存信息&#xff1a; # free -hm …...

[JavaWeb玩耍日记]HTML+CSS+JS快速使用

目录 一.标签 二.指定css 三.css选择器 四.超链接 五.视频与排版 六.布局测试 七.布局居中 八.表格 九.表单 十.表单项 十一.JS引入与输出 十二.JS变量&#xff0c;循环&#xff0c;函数 十三.Array与字符串方法 十四.自定义对象与JSON 十五.BOM对象 十六.获取…...

如何使用ArcGIS Pro创建最低成本路径

虽然两点之间直线最短&#xff0c;但是在实际运用中&#xff0c;还需要考虑地形、植被和土地利用类型等多种因素&#xff0c;需要加权计算最低成本路径&#xff0c;这里为大家介绍一下计算方法&#xff0c;希望能对你有所帮助。 数据来源 教程所使用的数据是从水经微图中下载…...

Neoverse CSS N3:实现市场领先能效的最快途径

区分老的架构 从云到边缘&#xff0c;Arm Neoverse 提供无与伦比的性能、效率、设计灵活性和 TCO 优势&#xff0c;正在颠覆传统基础设施芯片。 我们看到云和超大规模服务运营商正在推动更高的计算密度。随着 128 核心 CPU 设计上市&#xff08;Microsoft Cobalt、阿里巴巴 Y…...

JavaScript实现的计时器效果

之前做过电商网站倒计时的效果&#xff0c;今天在倒计时的基础上&#xff0c;把代码修改了一下&#xff0c;改为计时器效果&#xff0c;实现了以下功能&#xff1a; 1.点击“开始”后&#xff0c;按秒计时且“开始”文字变为“停止”&#xff1b; 2.点击“停止”&#xff0c;计…...

仿函数(Functor(c++))

定义 仿函数&#xff08;Functor&#xff09;是一个可以像函数那样被调用的类对象。这意味着它实现了operator()&#xff0c;使得类的对象可以像函数那样被调用。 仿函数的主要特点 它是一个类。它重载了operator()。可以通过创建该类的对象&#xff0c;并像函数那样调用该对…...

RocketMQ延迟消息机制

两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数&#xff0c;对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后&#xf…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台&#xff08;Launchpad&#xff09;多出来了&#xff1a;Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显&#xff0c;都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

微服务商城-商品微服务

数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...

在 Spring Boot 项目里,MYSQL中json类型字段使用

前言&#xff1a; 因为程序特殊需求导致&#xff0c;需要mysql数据库存储json类型数据&#xff0c;因此记录一下使用流程 1.java实体中新增字段 private List<User> users 2.增加mybatis-plus注解 TableField(typeHandler FastjsonTypeHandler.class) private Lis…...

Qt的学习(一)

1.什么是Qt Qt特指用来进行桌面应用开发&#xff08;电脑上写的程序&#xff09;涉及到的一套技术Qt无法开发网页前端&#xff0c;也不能开发移动应用。 客户端开发的重要任务&#xff1a;编写和用户交互的界面。一般来说和用户交互的界面&#xff0c;有两种典型风格&…...

32位寻址与64位寻址

32位寻址与64位寻址 32位寻址是什么&#xff1f; 32位寻址是指计算机的CPU、内存或总线系统使用32位二进制数来标识和访问内存中的存储单元&#xff08;地址&#xff09;&#xff0c;其核心含义与能力如下&#xff1a; 1. 核心定义 地址位宽&#xff1a;CPU或内存控制器用32位…...

从零手写Java版本的LSM Tree (一):LSM Tree 概述

&#x1f525; 推荐一个高质量的Java LSM Tree开源项目&#xff01; https://github.com/brianxiadong/java-lsm-tree java-lsm-tree 是一个从零实现的Log-Structured Merge Tree&#xff0c;专为高并发写入场景设计。 核心亮点&#xff1a; ⚡ 极致性能&#xff1a;写入速度超…...

raid存储技术

1. 存储技术概念 数据存储架构是对数据存储方式、存储设备及相关组件的组织和规划&#xff0c;涵盖存储系统的布局、数据存储策略等&#xff0c;它明确数据如何存储、管理与访问&#xff0c;为数据的安全、高效使用提供支撑。 由计算机中一组存储设备、控制部件和管理信息调度的…...

RKNN开发环境搭建2-RKNN Model Zoo 环境搭建

目录 1.简介2.环境搭建2.1 启动 docker 环境2.2 安装依赖工具2.3 下载 RKNN Model Zoo2.4 RKNN模型转化2.5编译C++1.简介 RKNN Model Zoo基于 RKNPU SDK 工具链开发, 提供了目前主流算法的部署例程. 例程包含导出RKNN模型, 使用 Python API, CAPI 推理 RKNN 模型的流程.   本…...

OpenHarmony标准系统-HDF框架之I2C驱动开发

文章目录 引言I2C基础知识概念和特性协议&#xff0c;四种信号组合 I2C调试手段硬件软件 HDF框架下的I2C设备驱动案例描述驱动Dispatch驱动读写 总结 引言 I2C基础知识 概念和特性 集成电路总线&#xff0c;由串网12C(1C、12C、Inter-Integrated Circuit BUS)行数据线SDA和串…...