python学习笔记(31)魔法方法--字典转成对象

魔法方法: 

一个类里面有一些特殊作用的方法,不需要你调用,在一些情况下会自动运行
类里面 __funname__ 都是魔法方法,有一些特殊作用

   字典取值的话,需要d["name"] 或者d.get("xx"),如果把字典转成一个对象,那取值就很方便了,d.name这样取就可以了,

   下面这个类就是把字典转成一个对象的,传入一个字典后,会自动把字典转成对象,就可以xx.xx这么用了

 

class DictToObject(dict):
    '''字典转对象'''
    def __init__(self,*args,**kwargs):
        super().__init__(*args,**kwargs) 
        #先调用父类的构造方法,因为传进来的是一个字典,dict这个类会把你传入的{k:v}这样的变成一个dict的类
 
    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这个类的对象
 
        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
 
if __name__ == '__main__':
    person = {'name':'xiaohei',
              'sex':'male',
              'addr':'beijing',
              'car':[{'country':'china','brand':'byd'},{'country':'jp','brand':'nissan'}],
              'money':{'financial':5000,'salary':6000,'stock':7000}
              }
    p_obj = DictToObject(person)
    print(p_obj.name)
    print(p_obj.sex)
    print(p_obj.money.salary)
    print(p_obj.car[0].brand)
    print(p_obj.car[0].country)
    print(p_obj.car[1].country)

  

  有点难度,后续继续研究,先放着...............

posted @ 2020-06-14 17:10  布谷鸟的春天  阅读(510)  评论(0编辑  收藏  举报