• __getattr__ 与动态属性


    直接上代码

    >>> class Test(object):
    ...     def __getattr__(self,attr_name):
    ...             setattr(self, attr_name, '(default)')
    ...             return self.attr_name
    ... 
    >>> t=Test()
    >>> t.name
    '(default)'
    >>> t.age
    '(default)'
    >>> t.name='smith'
    >>> t.name
    'smith'
    >>> t.age=38
    >>> t.age
    38

    是不是感觉节操碎了一地?

    原理剖析:

    默认:

    class_object.attr   --> 去 class_object.__dict__中寻找 attr的属性 --(没找着)---> class.__dict__ ----(没找者) ----> parent_class.__dict__---(没找着)----> 抛出异常 AttrbiuteError

    当class定义了自己的__getattr__(而不是__getattribute__, 慎重写)时,寻找逻辑是这样的:

    class_object.attr   --> 去 class_object.__dict__中寻找 attr的属性 --(没找着)---> class.__dict__ ----(没找者) ----> 调用class的__getattr__来动态“生成”属性(返回对应属性的值,没有return则为None)

    转载请注明来源:http://www.cnblogs.com/Tommy-Yu/p/5480975.html

    参考:http://m.jb51.net/article/59908.htm

    谢谢!

  • 相关阅读:
    vue axios创建实例
    vue axios全局配置
    vue axios并发请求
    vue axios HTTP 库
    vuex actions异步操作
    vuex getters
    Go并发控制--Channel篇
    UVA10228 A Star not a Tree?
    P1395 会议
    P1337 [JSOI2004]平衡点 / 吊打XXX
  • 原文地址:https://www.cnblogs.com/Tommy-Yu/p/5480975.html
Copyright © 2020-2023  润新知