https://blog.csdn.net/chenyulancn/article/details/8203763
一、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
- >>> 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'