魔法方法:
一个类里面有一些特殊作用的方法,不需要你调用,在一些情况下会自动运行
类里面 __funname__ 都是魔法方法,有一些特殊作用
字典取值的话,需要d["name"] 或者d.get("xx"),如果把字典转成一个对象,那取值就很方便了,d.name这样取就可以了,
下面这个类就是把字典转成一个对象的,传入一个字典后,会自动把字典转成对象,就可以xx.xx这么用了
class DictToObject(dict):
'''字典转对象'''
def __init__(self,*args,**kwargs):
super().__init__(*args,**kwargs)
#先调用父类的构造方法,因为传进来的是一个字典,dict这个类会把你传入的{k:v}这样的变成一个dict的类
def __getattr__(self, item):
#__getattr__的作用是通过x.xx的时候它会自动调用__getattr__这个方法,把你要获取的属性的key传过来
#比如说 user.name ,它就是调用了__getattr__,把name传给__getattr__函数,然后返回这个name的值
value = self[item]
if isinstance(value,dict):
value = DictToObject(value)#如果是字典类型,直接返回DictToObject这个类的对象
elif isinstance(value,list) or isinstance(value,tuple):
#如果是list,循环list判断里面的元素,如果里面的元素是字典,那么就把字典转成DictToObject的对象
value = list(value)
for index,obj in enumerate(value):
if isinstance(obj,dict):
value[index] = DictToObject(obj)
return value
if __name__ == '__main__':
person = {'name':'xiaohei',
'sex':'male',
'addr':'beijing',
'car':[{'country':'china','brand':'byd'},{'country':'jp','brand':'nissan'}],
'money':{'financial':5000,'salary':6000,'stock':7000}
}
p_obj = DictToObject(person)
print(p_obj.name)
print(p_obj.sex)
print(p_obj.money.salary)
print(p_obj.car[0].brand)
print(p_obj.car[0].country)
print(p_obj.car[1].country)
有点难度,后续继续研究,先放着...............