定义:
- 一个类里面有一些特殊作用的方法,不需要你调用,在一些情况下会自动运行
- 类里面 __funname__ 都是魔法方法,有一些特殊作用
练习:
简单类型的字典获取:
class DictToObject(dict):
def __getattr__(self, item):
value = self[item]
return value
d = DictToObject({'a':1})
print(d.a) #有__getattr__方法,就可以直接 d.a 这种方式来直接的调用了
#结果
1
复杂点的字典类型获取:
class DictToObject(dict):
def __getattr__(self, item):
value = self[item]
if type(value) == dict: # 判断下如果类型是dict(字典类型)
value = DictToObject(value) # 把{'sarlay':500给到类
return value
d1= {'a':1,'name':'xioahei','money':{'sarlay':500}}
d = DictToObject(d1)
print(d.money.sarlay)
#结果
500
字典里面嵌套list:
class DictToObject(dict):
'''字典转对象'''
# def __init__(self,*args,**kwargs):
# super.__init__(*args,**kwargs) #如果是想要修改父类的方法,可以使用此方法在下边做修改
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这个类的对象
#是字典了再次把调用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
d1 = {'a':1,'name':'xiaohei','money':{'sarlay':500},
'car':[ {'name':'benz'} ,{'name':'bmw'},12,3,4 ]
}
d = DictToObject(d1)
print(d.car[0].name)
#结果
benz