python对象转字典的两种实现方式示例


Posted in Python onNovember 07, 2019

本文实例讲述了python对象转字典的两种实现方式。分享给大家供大家参考,具体如下:

一. 方便但不完美的__dict__

对象转字典用到的方法为__dict__. 比如对象对象a的属性a.name='wk', a.age=18, 那么如果直接将使用a.__dict__获得对应的字典的值为: {name: 'wk', aget:18}, 很方便, 但是也存在一些限制. 其不完美之处在于:

比如:

class A(object):
  name = 'wukt'
  age = 18
  def __init__(self):
    self.gender = 'male'
a = A()
print(a.__dict__)

此时的打印结果是:

{gender: 'male'}

但是类变量name和age无法一同转换.

二. 使用dict

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

a = A()
dict(a)

使用dict之时, 将自动调用类中的keys方法, keys中定义了字典的键, 调用keys方法后, 程序将依照字典取值的方式尝试获得这些键对应的值.

当使用如字典的取值方式时: 比如a['name'], 将会调用类中的__getitem__方法, __getitem__方法决定了这个值是多少.

因此只需要在一例中添加两个方法就可以使对象可以通过dict转字典:

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

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

完整代码:

class A(object):
  name = 'wukt'
  age = 18
  def __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)

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
Python操作MySQL简单实现方法
Jan 26 Python
python输出指定月份日历的方法
Apr 23 Python
用Python计算三角函数之acos()方法的使用
May 15 Python
Python 使用SMTP发送邮件的代码小结
Sep 21 Python
python3实现TCP协议的简单服务器和客户端案例(分享)
Jun 14 Python
Python列表推导式、字典推导式与集合推导式用法实例分析
Feb 07 Python
Python Pillow Image Invert
Jan 22 Python
浅谈pyqt5在QMainWindow中布局的问题
Jun 21 Python
Python基础之字典常见操作经典实例详解
Feb 26 Python
解决python3插入mysql时内容带有引号的问题
Mar 02 Python
Python AutoCAD 系统设置的实现方法
Apr 01 Python
Python中关于logging模块的学习笔记
Jun 03 Python
python多线程高级锁condition简单用法示例
Nov 07 #Python
python文件操作的简单方法总结
Nov 07 #Python
详解Django admin高级用法
Nov 06 #Python
Python全局锁中如何合理运用多线程(多进程)
Nov 06 #Python
Python实现socket非阻塞通讯功能示例
Nov 06 #Python
Python中生成一个指定长度的随机字符串实现示例
Nov 06 #Python
详解Python list和numpy array的存储和读取方法
Nov 06 #Python
You might like
php把大写命名转换成下划线分割命名
2015/04/27 PHP
微信支付PHP SDK之微信公众号支付代码详解
2015/12/09 PHP
比较完整的微信开发php代码
2016/08/02 PHP
PHP数组编码gbk与utf8互相转换的两种方法
2016/09/01 PHP
js使用cookie记录用户名的方法
2015/11/26 Javascript
AngularJS入门教程之REST和定制服务详解
2016/08/19 Javascript
JavaScript数据类型学习笔记分享
2016/09/01 Javascript
vue2.0构建单页应用最佳实战
2017/04/01 Javascript
js轮播图无缝滚动效果
2017/06/17 Javascript
Vue仿支付宝支付功能
2018/05/25 Javascript
JavaScript引用类型RegExp基本用法详解
2018/08/09 Javascript
JS/HTML5游戏常用算法之碰撞检测 像素检测算法实例详解
2018/12/12 Javascript
深入理解使用Vue实现Context-Menu的思考与总结
2019/03/09 Javascript
详解Nodejs get获取远程服务器接口数据
2019/03/26 NodeJs
electron-vue利用webpack打包实现多页面的入口文件问题
2019/05/12 Javascript
jquery弹窗时禁止body滚动条滚动的例子
2019/09/21 jQuery
JavaScript实现单图片上传并预览功能
2019/09/30 Javascript
如何通过vscode运行调试javascript代码
2020/07/24 Javascript
如何将Node.js中的回调转换为Promise
2020/11/10 Javascript
[36:33]完美世界DOTA2联赛循环赛 Matador vs Forest 第一场 11.06
2020/11/06 DOTA
python基础教程之序列详解
2014/08/29 Python
用Python的SimPy库简化复杂的编程模型的介绍
2015/04/13 Python
在Django的视图中使用数据库查询的方法
2015/07/16 Python
Python爬虫:通过关键字爬取百度图片
2017/02/17 Python
关于Python如何避免循环导入问题详解
2017/09/14 Python
python设置值及NaN值处理方法
2018/07/03 Python
Python中的单行、多行、中文注释方法
2018/07/19 Python
Python + selenium + crontab实现每日定时自动打卡功能
2020/03/31 Python
如何解决安装python3.6.1失败
2020/07/01 Python
Pandas替换及部分替换(replace)实现流程详解
2020/10/12 Python
python网络爬虫实现发送短信验证码的方法
2021/02/25 Python
css3 box-shadow阴影(外阴影与外发光)图示讲解
2017/08/11 HTML / CSS
中班幼儿评语大全
2014/04/30 职场文书
小城镇建设汇报材料
2014/08/16 职场文书
python实现网络五子棋
2021/04/11 Python
Nginx配置之禁止指定IP访问
2022/05/02 Servers