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 Django(图文)
Nov 04 Python
python数据结构树和二叉树简介
Apr 29 Python
Python爬虫:通过关键字爬取百度图片
Feb 17 Python
python3 图片referer防盗链的实现方法
Mar 12 Python
图解Python变量与赋值
Apr 03 Python
python对list中的每个元素进行某种操作的方法
Jun 29 Python
快速解决docker-py api版本不兼容的问题
Aug 30 Python
使用python快速在局域网内搭建http传输文件服务的方法
Nov 14 Python
开启Django博客的RSS功能的实现方法
Feb 17 Python
基于tf.shape(tensor)和tensor.shape()的区别说明
Jun 30 Python
python利用platform模块获取系统信息
Oct 09 Python
Python的代理类实现,控制访问和修改属性的权限你都了解吗
Mar 21 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
《OVERLORD》第四季,终于等到你!
2020/03/02 日漫
php 数组使用详解 推荐
2011/06/02 PHP
Zend Framework实现多服务器共享SESSION数据的方法
2016/03/22 PHP
php使用QueryList轻松采集js动态渲染页面方法
2018/09/11 PHP
禁止你的左键复制实用技巧
2013/01/04 Javascript
nodejs实现获取某宝商品分类
2015/05/28 NodeJs
JavaScript编写简单的计算器
2015/11/25 Javascript
jquery实现定时自动轮播特效
2015/12/10 Javascript
JavaScript的Backbone.js框架环境搭建及Hellow world示例
2016/05/07 Javascript
深入理解JQuery中的事件与动画
2016/05/18 Javascript
JS实现焦点图轮播效果的方法详解
2016/12/19 Javascript
JS实现颜色梯度与渐变效果完整实例
2016/12/30 Javascript
微信小程序实现列表页的点赞和取消点赞功能
2018/11/02 Javascript
vue实现的上拉加载更多数据/分页功能示例
2019/05/25 Javascript
vue 父组件通过v-model接收子组件的值的代码
2019/10/27 Javascript
Jquery 获取相同NAME 或者id删除行操作
2020/08/24 jQuery
[04:30]显微镜下的DOTA2第五期——拉比克
2013/09/26 DOTA
[02:47]DOTA2亚洲邀请赛 HR战队出场宣传片
2015/02/07 DOTA
在Python中操作字符串之rstrip()方法的使用
2015/05/19 Python
Python中字典的基本知识初步介绍
2015/05/21 Python
Python构建XML树结构的方法示例
2017/06/30 Python
python中的变量如何开辟内存
2018/06/26 Python
python3中函数参数的四种简单用法
2018/07/09 Python
Python计算开方、立方、圆周率,精确到小数点后任意位的方法
2018/07/17 Python
python使用matplotlib库生成随机漫步图
2018/08/27 Python
pygame游戏之旅 添加游戏介绍
2018/11/20 Python
python将一个英文语句以单词为单位逆序排放的方法
2018/12/20 Python
python pytest进阶之conftest.py详解
2019/06/27 Python
python读取指定字节长度的文本方法
2019/08/27 Python
Python Selenium实现无可视化界面过程解析
2020/08/25 Python
社区版pycharm创建django项目的方法(pycharm的newproject左侧没有项目选项)
2020/09/23 Python
ProBikeKit英国:在线公路自行车之家
2017/02/10 全球购物
Shell编程面试题
2012/05/30 面试题
领导班子四风对照检查材料思想汇报
2014/09/26 职场文书
结婚当天新郎保证书
2015/05/08 职场文书
幼儿园托班教育随笔
2015/08/14 职场文书