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

yipeiwu_com6年前Python基础

本文实例讲述了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列表(list)操作技巧总结》、《Python函数使用技巧总结》、《Python数据结构与算法教程》、《Python字符串操作技巧汇总》及《Python入门与进阶经典教程

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

相关文章

python sys,os,time模块的使用(包括时间格式的各种转换)

sys模块 sys.argv: 实现从程序外部向程序传递参数。 位置参数argv[0]代表py文件本身,运行方法 python xx.py 参数1,参数2 。。 self = s...

Python编程把二叉树打印成多行代码

题目描述 从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。 思路: 1、把每层节点的val值用list存好 2、把每层节点存好: ①计算当层节点的个数,这样就保证下一步每...

python脚本实现统计日志文件中的ip访问次数代码分享

适用的日志格式: 106.45.185.214 - - [06/Aug/2014:07:38:59 +0800] "GET / HTTP/1.0" 200 10 "-" "-" 1...

Python 使用类写装饰器的小技巧

最近学到了一个有趣的装饰器写法,就记录一下。 装饰器是一个返回函数的函数。写一个装饰器,除了最常见的在函数中定义函数以外,Python还允许使用类来定义一个装饰器。 1、用类写装饰器 下...

python字符串替换re.sub()方法解析

pattern可以是一个字符串也可以是一个正则,用于匹配要替换的字符,如果不写,字符串不做修改。\1 代表第一个分组 repl是将会被替换的值,repl可以是字符串也可以是一个方法。如果...