1 class DictToObject(dict):
2 '''字典转对象'''
3 def __init__(self,*args,**kwargs):
4 super().__init__(*args,**kwargs)
5 #先调用父类的构造方法,因为传进来的是一个字典,dict这个类会把你传入的{k:v}这样的变成一个dict的类
6
7 def __getattr__(self, item):
8 #__getattr__的作用是通过x.xx的时候它会自动调用__getattr__这个方法,把你要获取的属性的key传过来
9 #比如说 user.name ,它就是调用了__getattr__,把name传给__getattr__函数,然后返回这个name的值
10 value = self[item]
11 if isinstance(value,dict):
12 value = DictToObject(value)#如果是字典类型,直接返回DictToObject这个类的对象
13
14 elif isinstance(value,list) or isinstance(value,tuple):
15 #如果是list,循环list判断里面的元素,如果里面的元素是字典,那么就把字典转成DictToObject的对象
16 value = list(value)
17 for index,obj in enumerate(value):
18 if isinstance(obj,dict):
19 value[index] = DictToObject(obj)
20 return value
21
22 if __name__ == '__main__':
23 person = {'name':'xiaohei',
24 'sex':'male',
25 'addr':'beijing',
26 'car':[{'country':'china','brand':'byd'},{'country':'jp','brand':'nissan'}],
27 'money':{'financial':5000,'salary':6000,'stock':7000}
28 }
29 p_obj = DictToObject(person)
30 print(p_obj.name)
31 print(p_obj.sex)
32 print(p_obj.money.stock)
33 # print(p_obj.car[0].brand)
34 # print(p_obj.car[0].country)
35 # print(p_obj.car[1].country)