1. 程式人生 > >python中 class 或物件屬性轉化成dict 、dict轉換成物件

python中 class 或物件屬性轉化成dict 、dict轉換成物件

 一、class 或物件 屬相轉化成dict ,

class 和類物件的屬性有所區別,有興趣的可以輸出類和物件的 __dict__ 檢視一下,

>>> class A(object):
...   def __init__(self):
...     self.b = 1
...     self.c = 2
...   def do_nothing(self):
...     pass
...
>>> a = A()
>>> a.__dict__
{'c': 2, 'b': 1}

把類或類物件的屬性(包括方法)轉化為dict:
>>> class Foo(object):
...     bar = 'hello'
...     baz = 'world'
...
>>> f = Foo()
>>> [name for name in dir(f) if not name.startswith('__')]
[ 'bar', 'baz' ]
>>> dict((name, getattr(f, name)) for name in dir(f) if not name.startswith('__')) 
{ 'bar': 'hello', 'baz': 'world' }

可以改進上述方法,只返回資料屬性,不包括方法:

dict((name, getattr(f, name)) for name in dir(f) 
       if not name.startswith('__')  and not callable(value)) 

或者
def props(obj):
    pr = {}
    for name in dir(obj):
        value = getattr(obj, name)
        if not.name.startswith('__') and not callable(value):
            pr[name] = value
    return pr
二、dict 轉化成object
>>> d
{'a': 1, 'b': {'c': 2}, 'd': ['hi', {'foo': 'bar'}]}
>>> def obj_dic(d):
    top = type('new', (object,), d)
    seqs = tuple, list, set, frozenset
    for i, j in d.items():
    	if isinstance(j, dict):
    	    setattr(top, i, obj_dic(j))
    	elif isinstance(j, seqs):
    	    setattr(top, i, 
    		    type(j)(obj_dic(sj) if isinstance(sj, dict) else sj for sj in j))
    	else:
    	    setattr(top, i, j)
    return top

>>> x = obj_dic(d)
>>> x.a
1
>>> x.b.c
2
>>> x.d[1].foo
'bar'

http://stackoverflow.com/questions/1305532/convert-python-dict-to-object

http://stackoverflow.com/questions/61517/python-dictionary-from-an-objects-fields