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

    谢谢!

  • 相关阅读:
    关于位运算(转)
    计蒜客第三场
    数组与指针
    计蒜客第二场
    指针概念
    爬楼梯(动态规划)
    线性表基本操作的实现(合并)
    4123=喵帕斯之天才少女
    3889=神奇的函数
    1586=计算组合数
  • 原文地址:https://www.cnblogs.com/Tommy-Yu/p/5480975.html
Copyright © 2011-2022 走看看