python将字典转为object,实现类似js对字典属性的调用

经常写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本身的值也得到了相应的更新

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值