Python类实例的json

web开发中有这么一个场景,我们从数据库中查询某一数据的时候,往往需要对数据进行一些转化之后才能传给前端。

当然我们可以根据查询出来的实例对象,构建一个dict返回,这样会导致我们的代码非常的臃肿。但是这也确实是一种最直接的方式。

除此之外我们来看另外一种方式。

调用类的__dict__函数将类的一些属性转化字典进行序列化

import json
class UserTest:# 类变量name = "hou"age = 18# 实例变量def __init__(self):self.nickname = "user1"user = UserTest()
print(json.dumps(user))
# 直接序列化一个对象是会报错的
# TypeError: Object of type UserTest is not JSON serializabledct = user.__dict__
print(json.dumps(dct))
{"nickname": "user1"}

此时你会看到类变量通过__dict__函数是不会被转化字典从而被序列化的。

如果我们想要将类变量也转化为字典从而被序列化那要怎么办呢?
此时你需要重写这两个函数def keys(self)def __getitem__(self, item)

class User:name = "hou"age = 18def __init__(self):self.nickname = "user1"def keys(self):# keys函数可以通过dict(self)返回对象构建字典的key集合# 重写keys函数,类的属性也可以通过dict的形式进行访问# 返回值必须是一个可迭代的对象return ("name", "age", "nickname")def __getitem__(self, item):# 根据item获取对象属性的值return getattr(self, item)user = User()
print(user.name) # 对象.属性访问
print(user["name"]) # 字典形式访问
print(user["age"])
print(user["nickname"])# dict在传入对象实例的时候会尝试构建字典
# 通过对象的keys获取对象的键值,__getitem__获取对象属性的值
dct = dict(user)
print(dct)
# {'name': 'hou', 'age': 18, 'nickname': 'user1'}

此时还有一个问题,如果我们只想通过dict(对象)返回特定的属性如何操作呢?
此时只要在keys函数中指定返回的集合即可。

class User:name = "hou"age = 18def __init__(self):self.nickname = "user1"def keys(self):return ("name", "nickname")def __getitem__(self, item):return getattr(self, item)user = User()
dct = dict(user)
print(dct)
# {'name': 'hou', 'nickname': 'user1'}

如果一个类的属性比较多,我们只想根据传参的集合来构架字典从而序列化如何做呢?
我们只需要在类实例化的时候指定keys需要返回的字段即可。

class User:name = "hou"age = 18def __init__(self):self.nickname1 = "user1"self.nickname2 = "user2"self.nickname3 = "user3"self.nickname4 = "user4"self.nickname5 = "user5"# self.fields = ["name", "age", "nickname1", "nickname2", "nickname3", "nickname4", "nickname5"]self.fields = []def keys(self):return self.fieldsdef __getitem__(self, item):return getattr(self, item)def to_dict(self, *keys):for key in keys:self.fields.append(key)user = User()
user.to_dict("nickname1", "nickname3")
dct = dict(user)
print(dct)
# {'nickname1': 'user1', 'nickname3': 'user3'}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/42317.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络空间测绘是什么?

网络空间测绘是一种技术过程,用于探测、分析和可视化互联网及其他网络环境中的各种资源和连接。这个概念在2016年开始广泛使用,它涉及到收集有关网络节点(如服务器、路由器、个人电脑和其他设备)的信息,并建立这些节点…

C++ STL 多线程库用法介绍

目录 一:Atomic: 二:Thread 1. 创建线程 2. 小心移动(std::move)线程 3. 如何创建带参数的线程 4. 线程参数是引用类型时,要小心谨慎。 5. 获取线程ID 6. jthread 7. 如何在线程中使用中断 stop_token 三:如何解决数据竞争 1.有问题的代码 2.使用互斥 3.预防…

Vue3+.NET6前后端分离式管理后台实战(二十八)

1,Vue3.NET6前后端分离式管理后台实战(二十八)

【Linux进阶】文件系统6——理解文件操作

目录 1.文件的读取 1.1.目录 1.2.文件 1.3.目录树读取 1.4.文件系统大小与磁盘读取性能 2.增添文件 2.1.数据的不一致(Inconsistent)状态 2.2.日志式文件系统(Journaling filesystem) 3.Linux文件系统的运行 4、文件的删…

动态规划算法-以中学排班管理系统为例

1.动态规划算法介绍 1.算法思路 动态规划算法通常用于求解具有某种最优性质的问题。在这类问题中,可能会有许多可行解。每一个解都对应于一个值,我们希望找到具有最优值的解。动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若…

干货 | 2024大模型场景下智算平台的设计与优化实践(免费下载)

诚挚邀请您微信扫描以下二维码加入方案驿站知识星球,获取上万份PPT/WORD解决方案!!!感谢支持!!!

android pdf框架-11,查看图片

前10篇文章,9章关于pdf的,pdf解析后,里面也是有各种图片,于是利用pdf的view来展示图片,似乎也是个不错的想法. android手机中的图片查看功能,有的可以展示,有的不能.比如华为,荣耀对大体积的png是可以显示的,小米是不显示,只有缩略图. 一张png50m大,比如清明上河图,原图是tif…

【C++】string的底层原理及实现

文章目录 string类的存储结构默认成员函数构造函数析构函数拷贝构造函数赋值重载 容量操作size()capacity()reserve()resize()clear() 遍历与访问operator[ ]迭代器范围与for 增删查改push_back()pop_back()append()operatorinsert()erase()c_str()find()substr() 非成员函数op…

c#的List<T>的SelectMany 和Select

在C#中&#xff0c;List<T>&#xff08;以及任何实现了IEnumerable<T>的集合&#xff09;的Select和SelectMany扩展方法都是LINQ&#xff08;Language Integrated Query&#xff09;的一部分&#xff0c;用于对集合中的元素进行查询和转换。 尽管它们的作用有些相…

Virtualbox和ubuntu之间的关系

1、什么是ubuntu Ubuntu 是一个类似于 Windows 的操作系统&#xff0c;但它是基于 Linux 内核开发的开源操作系统 2、什么是Virtualbox VirtualBox 是一款虚拟机软件&#xff0c;使我们可以物理机上创建和运行虚拟机 也就是说,VirtualBox 提供了一个可以安装和运行其他操作系…

力扣考研经典题 反转链表

核心思想 头插法&#xff1a; 不断的将cur指针所指向的节点放到头节点之前&#xff0c;然后头节点指向cur节点&#xff0c;因为最后返回的是head.next 。 解题思路 1.如果头节点是空的&#xff0c;或者是只有一个节点&#xff0c;只需要返回head节点即可。 if (head null …

算法训练营day70

题目1&#xff1a;108. 冗余连接 (kamacoder.com) #include<iostream> #include<vector>using namespace std;int n; vector<int> father(10001, 0);void init() {for(int i 1;i < n;i) father[i] i; }int find(int u) {return u father[u] ? u : fa…

Echarts中的热力图和漏斗图(在Vue中使用热力图和漏斗图)

热力图 (Heatmap) Echarts的热力图用于展示两个维度数据矩阵中的值分布情况。它通过在平面上划分成多个矩形区域&#xff0c;并用不同的颜色填充这些区域来表示数据的大小或强度。颜色渐变从浅到深通常映射着数值从小到大&#xff0c;从而直观展示数据的集中程度和分布模式。热…

Mojolicious测试驱动开发:单元与集成测试的艺术

标题&#xff1a;Mojolicious测试驱动开发&#xff1a;单元与集成测试的艺术 Mojolicious是一个现代化的Perl Web开发框架&#xff0c;它不仅提供了强大的Web应用开发能力&#xff0c;还内置了丰富的测试工具来支持单元测试和集成测试。本文将深入探讨如何在Mojolicious中进行…

人工智能期末复习简答题

简答: 子句集的化简(1).消去连接词”—>”和”<—>” (2)减少否定符号的辖域 (3)对变元标准化 (4)化为前束范式 (5)消去存在量词 (6)化为Skolem标准形 (7)消去全称量词 (8)消去合取词 (9)更换变元名称 2.在状态空间搜索中,Open表与Close…

半同步主从复制

半同步主从复制的概念 半同步主从复制&#xff08;Semisynchronous Replication, SBR&#xff09;是MySQL数据库中的一种数据复制方式&#xff0c;它在异步复制的基础上增加了一定程度的同步性&#xff0c;旨在提高数据安全性&#xff0c;减少数据丢失的风险。 半同步主从复制…

LeetCode 3101.交替子数组计数:等差数列求和(较详题解)

【LetMeFly】3101.交替子数组计数&#xff1a;等差数列求和&#xff08;较详题解&#xff09; 力扣题目链接&#xff1a;https://leetcode.cn/problems/count-alternating-subarrays/ 给你一个二进制数组 nums 。 如果一个子数组中 不存在 两个 相邻 元素的值 相同 的情况&a…

阶段三:项目开发---大数据开发运行环境搭建:任务8:安装配置Redis

任务描述 知识点&#xff1a;安装配置Redis 重 点&#xff1a; 安装配置Redis 难 点&#xff1a;无 内 容&#xff1a; Redis&#xff08;Remote Dictionary Server )&#xff0c;即远程字典服务&#xff0c;是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可…

【C++:运算符重载】

运算符重载 特点&#xff1a; 函数名由operator运算符组成 注&#xff1a; 不能通过其他符号创建新的操作符&#xff0c;只能使用C/C语法存在的操作符重载操作符必须有一个类类型参数&#xff0c;原因&#xff1a;不能重载操作符改变内置类型的行为当类成员操作符重载时&#…

web自动化(五)上传文件

我们需要准备一个上传文件的html&#xff0c;创建a.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>文件上传示例</title> </head> <body><form action"/upload"…