zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Linux常用命令-centos
    USACO 2006 Open, Problem. The Country Fair 动态规划
    USACO 2007 March Contest, Silver Problem 1. Cow Traffic
    USACO 2007 December Contest, Silver Problem 2. Building Roads Kruskal最小生成树算法
    USACO 2015 February Contest, Silver Problem 3. Superbull Prim最小生成树算法
    LG-P2804 神秘数字/LG-P1196 火柴排队 归并排序, 逆序对
    数据结构 并查集
    浴谷国庆集训 对拍
    1999 NOIP 回文数
    2010 NOIP 普及组 第3题 导弹拦截
  • 原文地址:https://www.cnblogs.com/brf-test/p/13340245.html
Copyright © 2011-2022 走看看