Python 类---魔法方法

定义:

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

 练习:

简单类型的字典获取:

class DictToObject(dict):
    def __getattr__(self, item):
        value = self[item]
        return value

d = DictToObject({'a':1})
print(d.a) #有__getattr__方法,就可以直接 d.a 这种方式来直接的调用了

#结果
1

 复杂点的字典类型获取:

class DictToObject(dict):
    def __getattr__(self, item):
        value = self[item]
        if type(value) == dict: # 判断下如果类型是dict(字典类型)
            value = DictToObject(value) # 把{'sarlay':500给到类
        return value

d1= {'a':1,'name':'xioahei','money':{'sarlay':500}}
d = DictToObject(d1)
print(d.money.sarlay)

#结果
500

字典里面嵌套list:

class DictToObject(dict):
    '''字典转对象'''
    # def __init__(self,*args,**kwargs):
    #     super.__init__(*args,**kwargs) #如果是想要修改父类的方法,可以使用此方法在下边做修改
    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这个类的对象
            #是字典了再次把调用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
d1 = {'a':1,'name':'xiaohei','money':{'sarlay':500},
      'car':[ {'name':'benz'} ,{'name':'bmw'},12,3,4  ]
      }
d = DictToObject(d1)
print(d.car[0].name)

#结果
benz

原文地址:https://www.cnblogs.com/brf-test/p/13340245.html