zoukankan      html  css  js  c++  java
  • CLASS 类 __getattr__

    class Chain(object):
    def __init__(self, path=''):
    self._path = path
    def __getattr__(self, path):
    return Chain('%s/%s' % (self._path, path))
    def __str__(self):
    return self._path
    __repr__ = __str__

    #A =Chain()
    print(Chain().status.user.timeline.list) #与下面代码效果一样,从左到右一个个的执行的
    print((((Chain().status).user).timeline).list)

    #第一次初始化方法没有传递path的值,默认参数为'', 查找没有status这个属性,然后执行 __getattr__这个方法把status当做参数传到__getattr__中,然后返回Chain('/status')
    #第二次初始化方法传递path的值为‘/status',查找没有user这个属性,然后执行 __getattr__这个方法把user当做参数传到__getattr__中,然后返回Chain('/status/user')
    #第三次初始化方法传递path的值为/status/user',查找没有timeline这个属性,然后执行 __getattr__这个方法把timeline当做参数传到__getattr__中,然后返回Chain('/status/user/timeline')
    #以此类推,最后是 Chain('/status/user/timeline/list') 然后调用 __str__()方法返回self._path


    # 先执行Chain().status然后再执行后面的.user执行完后再执行后面的.timeline,然后再执行.list

    执行结果:
    /status/user/timeline/list
    /status/user/timeline/list

    说明:
    当调用不存在的属性时,比如score,Python解释器会试图调用__getattr__(self, 'score')来尝试获得属性

    参考:
    https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014319098638265527beb24f7840aa97de564ccc7f20f6000
  • 相关阅读:
    Python 容器用法整理
    C/C++中浮点数格式学习——以IEEE75432位单精度为例
    关于C/C++中的位运算技巧
    [GeekBand] C++11~14
    [GeekBand] 探讨C++新标准之新语法——C++ 11~14
    [GeekBand] 面向对象的设计模式(C++)(2)
    [GeekBand] 面向对象的设计模式(C++)(1)
    [GeekBand] STL与泛型编程(3)
    [GeekBand] STL与泛型编程(2)
    [GeekBand] STL与泛型编程(1)
  • 原文地址:https://www.cnblogs.com/lighthouse/p/9646947.html
Copyright © 2011-2022 走看看