在实际项目中,当使用json模块加载一个深度很深的字典类型的json文件时,使用字典的访问方式,将会出现很多中括号,即不直观也不美观,可以将这个字典转化为对象,使得可以用.的方式访问。
代码如下:
class Dict2Obj(dict):
def __getattr__(self, key):
print('getattr is called')
if key not in self:
return None
else:
value = self[key]
if isinstance(value,dict):
value = Dict2Obj(value)
return value
dic = {
'zone':{
'city':'shenzhen',
'location':'sx tech building'
},
'code':{
'frontend':'vue',
'backend':'python'
}
}
dic2obj = Dict2Obj(dic)
print(dic2obj.zone.city)
输出:
getattr is called
getattr is called
shenzhen
原理很简单,就是重写__getattr__
方法,关于__getattr__
的介绍,可以参考之前的文章python getattribute 、getattr、setattr 详解。当一个对象通过’.'来访问一个属性时,如果报错,将会转到__getattr__
做进一步处理,此时就可以将该key对应的value返回,当然如果value仍然是一个字典,则需要将它继续转化为一个Dict2Obj
对象。
当访问不存在的key时,和字典一样,会弹出异常,为了避免这种情况发生,类似字典,可以使用get()
访问。