经常写js,习惯了js对字典属性的引用方式,于是打算将python的字典类型也写成这样。
总体思路如下,
1.继承dict类
2.利用dict类的__setattr__方法对属性名称与值进行设置
3.在原有__setattr__上再调用一次dict类的update方法,update的数据为__dict__,这样其中一个属性值改变,那该dict的值也跟着更新
代码如下:
class DictToObject(dict):
def __init__(self,dic):
dict.__init__(self)
for key,item in dic.items():
if key[0]!='_':
if type(item)==dict:
self.__setattr__(key,DictToObject(dict))
if type(item)==list:
self.__setattr__(key,self.__iterlist__(item))
else:
self.__setattr__(key,item)
#自定义的一个递归方法,用来将list内的dict元素也转为该类
def __iterlist__(self,item):
temp=[DictToObject(x) if type(x)==dict else x for x in item]
temp=[self.__iterlist__(x) if type(x)==list else x for x in temp]
return temp
#当类进行"."来访问属性时会调用该方法
def __setattr__(self,key,item):
dict.__setattr__(self,key,item)
#用__dict__来更新该类本身的值
self.update(self.__dict__)
test=DictToObject({'a':1,'b':2,'c':[1,2,{'e':1}]})
print('打印test为',test)
打印test为:{'a': 1, 'b': 2, 'c': [1, 2, {'e': 1}]}
可以看到它是个类,也是个值。
print(test.a)
1
这里可以直接通过属性名去获取字典内对应的值
test.a=2
print(test)
{'a': 2, 'b': 2, 'c': [1, 2, {'e': 1}]}
在修改其中一个属性值后,test本身的值也得到了相应的更新