因为常使用js内的字典,其类型提示与"."访问都比较方便,这里也为python增强其功能.
1.增加字典的"."操作符访问
实现思路.
网络上有一些简单的实现方式,但实际使用时存在一些问题,如在控制台内没有键的提示,数组内的字典没有得到增强等,我的实现方式没有这些问题.
- 继承dict类.
- 添加__setattr__方法.
- 递归字典数据进行__setattr__
如下为实现代码:
class DictPlus(dict):
def __init__(self,dic):
dict.__init__(self)
for key,item in dic.items():
if key[0]!='_':
if type(item)==dict:
self.__setattr__(key,DictPlus(dict))
if type(item)==list:
self.__setattr__(key,self.__iterlist__(item))
else:
self.__setattr__(key,item)
def __iterlist__(self,item):
temp=[DictPlus(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)
self.update(self.__dict__)
使用方式:
In[0] #初始化
In[1] data = {"user": "zhangsan", "age": 20, "father": {"name": "lisi", "age": 44}, "cars": [{"name": "bmw"}]}
In[2] data_plus = DictPlus(data)
In[3] #字典访问
data_plus.user
data_plus["user"]
data_plus.father.name
data_plus.cars[0].name
In[4] #字典值设置
data_plus.user="wangmazi"
data_plus.mather={"name":"xiaohong"}
备注:按上面的实现思路,还可以修改字典getter与setter方法,实现各种hook操作