目录

__dict__只能存储实例变量,不能存储类变量

情况一:(可以直接通过__dict__序列化对象)

情况二:(不能直接通过__dict__序列化对象)

情况三:(定义keys和__getitem__方法)

关于细节方面的测试


先给结论:python不能直接序列化对象(往下看)

对于普通得python对象来说,__dict__就可以序列化对象。

__dict__的作用:把类的实例对象的实例属性以字典形式返回。简单的说就是 用来存储实例变量


__dict__只能存储实例变量,不能存储类变量


情况一:(可以直接通过__dict__序列化对象)


情况二:(不能直接通过__dict__序列化对象)

但是如果对象里面的属性又是另外一个对象,那么这样就很容易出现递归好多对象,这样就无法直接序列化了。

情况如下图:

解决办法:

在代码中设置一个默认方法,按照下面写就行

整体测试代码如下:

情况三:(定义keys和__getitem__方法)

注意上图return的一定要是个序列,可以是元组也可以是列表。

使用dict的方式如下, 如果直接使用会报错.

a = A()
dict(a)

使用dict之时,将自动调用类中的keys方法,keys中定义了字典的键,调用keys方法后,程序将依照字典取值的方式尝试获得这些键对应的值。
当使用如字典的取值方式时: 比如a['name'],可以看到a['name']这样的方式是用来访问一个字典的,但是很明显我们的a不是一个字典,而是一个对象,如果对象想以a['name']这样的方式访问,我们就需要为对象增加一个方法叫__getitem__,当python遇到  对象[]  的方式的时候就会调用类中的__getitem__方法, 然后把name当做item参数传递进来,__getitem__方法返回的这个值就是a['name']所调用的结果
因此只需要在一例中添加两个方法就可以使对象可以通过dict转字典:

def keys(self):return ('name', 'age' )def __getitem__(self, item):return getattr(self, item)

通过这种方式, 既可以支持类变量的转换, 又可以自定义需要转换的字段.

完整代码:

class A(object):name = 'jenrey'age = 18def __init__(self):self.gender = 'male'def keys(self):'''当对实例化对象使用dict(obj)的时候, 会调用这个方法,这里定义了字典的键, 其对应的值将以obj['name']的形式取,但是对象是不可以以这种方式取值的, 为了支持这种取值, 可以为类增加一个方法'''return ('name', 'age', 'gender')def __getitem__(self, item):'''内置方法, 当使用obj['name']的形式的时候, 将调用这个方法, 这里返回的结果就是值'''return getattr(self, item)a = A()
r = dict(a)
print(r)

关于细节方面的测试

class D:name = 'zhangsan'age = 18def __init__(self):self.sex = '男'def keys(self):return ('name', 'age', 'sex')def __getitem__(self, item):return "111"d = D()
print(d.__dict__)  # {'sex': '男'}
print(dict(d))  # {'name': '111', 'age': '111', 'sex': '111'}

如何通过对象下面的属性名字来拿到这个属性的值呢?

就需要使用getattr方法(下图)

class D:name = 'zhangsan'age = 18def __init__(self):self.sex = '男'def keys(self):return ('name', 'sex')def __getitem__(self, item):return getattr(self, item)d = D()
print(d.__dict__)  # {'sex': '男'}
print(dict(d))  # {'name': 'zhangsan', 'sex': '男'} 如果注销了getitem方法就会报错TypeError: 'D' object is not iterable

keys方法只return一个只有一个元素的元组的时候会报错AttributeError: 'D' object has no attribute 'n'

class D:name = 'zhangsan'age = 18def __init__(self):self.sex = '男'def keys(self):return ('name')def __getitem__(self, item):return getattr(self, item)d = D()
print(d.__dict__)  # {'sex': '男'}
print(dict(d))  # keys方法只return一个的时候会报错AttributeError: 'D' object has no attribute 'n'

为什么是n呢?而且报错的时候是在getattr方法的时候报错的,这就说明这个getitem方法的形参item传入的是一个n而不是name,这是因为我们想的是 return('name')只是定义了一个元素的元组,但是一个元素的元组不是这么定义的,而是要在后面加入一个,号!return('name',)

class D:name = 'zhangsan'age = 18def __init__(self):self.sex = '男'def keys(self):return ('name',)def __getitem__(self, item):return getattr(self, item)d = D()
print(d.__dict__)  # {'sex': '男'}
print(dict(d))  # 注意定义一个元素的元组的时候要在后面加上逗号 {'name': 'zhangsan'}

class D:name = 'zhangsan'age = 18def __init__(self):self.sex = '男'def keys(self):return ['name']  # 是用列表也是可以的,只要是返回序列类型的就可以def __getitem__(self, item):return getattr(self, item)d = D()
print(d.__dict__)  # {'sex': '男'}
print(dict(d))  # {'name': 'zhangsan'}

python 对象转字典及序列化对象相关问题,__dict__!!!!必看,多坑相关推荐

  1. SIGIA_4P python学习 列表 字典 集合 面对对象编程 闭包 装饰器 函数式编程 作用域 异常处理

    SIGIA_4P python学习 列表 字典 集合 面对对象编程 闭包 装饰器 函数式编程 作用域 异常处理 本文连接 简介 SIGIA_4P 网址 a. 课程OKR Objectives and ...

  2. python self 序列_python中序列化对象

    # 序列化对象p1 import pickle                               # 内置库 class People: def __init__(self, name, a ...

  3. python b站日排行榜_B站2020年每周必看热门视频数据盘点!Python数据分析

    1.数据抓取 数据集的获取是我们进行数据分析的第一步.现在获取数据的主要途径一般为:现成数据:自己写爬虫去爬取数据:使用现有的爬虫工具爬取所需内容,保存到数据库,或以文件的形式保存到本地. 博主用的是 ...

  4. BMS电流相关的HX5020NLT必看及车规级隔离滤波器测试

    <p>Hqst盈盛电子导读:HX5020NLT是车规级隔离滤波器的一种,BMS电流相关的车规级隔离滤波器测试?车规级隔离滤波器HX5020NLT必看</p>   BMS电流相关 ...

  5. android中如何保存对象集合中,如何序列化对象并将其保存到Android中的文件?

    沧海一幻觉 我只是用Generics创建了一个类来处理它,所以它可以用于所有可序列化的对象类型:public class SerializableManager { /** * Saves a ser ...

  6. python单片机编程入门先学什么_编程入门必看:带你零基础了解编程和编程语言,入门应该学什么?...

    编程入门 什么是编程 我们通过有固定格式和固定词汇的"语言"来控制他人,让他人为我们做事情.语言有很多种,包括汉语.英语.法语.韩语等,虽然他们的词汇和格式都不一样,但是可以达到同 ...

  7. python删除文件夹无法访问_零基础小白必看:python基本操作-文件、目录及路径

    使用python的os模块,简单方便完成对文件夹.文件及路径的管理与访问操作. 1 前言 在最近开发中,经常需要对文件进行读取.遍历.修改等操作,想要快速.简单的完成这些操作,我选择用 python ...

  8. python字符串基本操作符_Python字符串及基本操作(入门必看)

    收录于话题 #Python入门 27个 基础入门的知识一直没有更新完,今天小张接着给大家带来入门级的字符串的常用操作.本文适合刚入门的小白,大佬们请绕过. 一.定义 字符串的意思就是"一串字 ...

  9. 微软python认证难不难_微软MTA认证98-381Python高分必看——100小时Python从0到1完全学习实战...

    Chapter 01 环境搭建 1.1 安装PYTHON 1.1.1 Windows下安装Python 1.2 开发学习 :IDLE简介 1.2.1 交互式 1.2.2 文件式 1.2.3 两种方式的 ...

最新文章

  1. iOS 11 导致tableview 刷新之后漂移问题
  2. 深度学习 CNN trick 合集
  3. Spring编程模型:Spring实现了哪些编程模型?
  4. SAP AET 框架是如何判断一个 SAP CRM UI 能否被扩展
  5. java 批量入库oracle_java操作Oracle数据库——ARRAY、TABLE类型批量入库
  6. DB2 存储过程中执行动态SQL的两种写法
  7. (111)FPGA面试题-介绍Verilog 块语句fork-join执行过程
  8. Unity VR开发出语音识别功能
  9. project项目管理软件の版本区别?
  10. BJ54坐标或者XA80坐标到WGS84坐标的转换(小工具附代码)
  11. 为何网站存在漏洞隐患需要做渗透测试服务
  12. 第四章:Android灯光系统(3)-编写HAL
  13. 美式九球比赛规则 (Nine-ball)
  14. Java生成名片式的二维码源码分享
  15. [C++]打开新世界的大门之C++入门
  16. Java有参构造方法和无参构造方法
  17. 设置word表格行高
  18. python中list线程安全问题
  19. 老司机怎么在今年3月8号前后的市场中利用DMI实现短线炒股
  20. Mysql唯一索引、主键索引、联合索引

热门文章

  1. 我所玩过的GALGAME——メンアットワーク!魔兽学院men at work2的中文版《永远的羁绊》全攻略...
  2. 网页设置的音频不能自动播放
  3. 记一次JVM调优(Permanent Generation)
  4. 计算机怎么解除c盘用户权限,电脑c盘没有权限如何恢复_win10系统c盘没有管理员权限怎么设置-系统城...
  5. PowerBI实用技巧:案例四(实现复杂动态矩阵TOPN and Others 排名分类)
  6. 【SLAM学习】(二)相机原理
  7. 《PBI系列 快选 人气新品池 品质档 03》花随花心著
  8. 老鼠也会跟着音乐「蹦迪」,最喜欢Lady Gaga的歌|日本新研究
  9. linux终端cd未找到命令,Linux cd 命令 command not found cd 命令详解 cd 命令未找到 cd 命令安装 - CommandNotFound ⚡️ 坑否...
  10. 夯实Java基础(面向对象)