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

    谢谢!

  • 相关阅读:
    php配置GD库
    Linux 安装 Apache2+php5+gd+freetype2
    gd库
    数组和链表的区别
    python 整数中1出现的次数
    python栈--字符串反转,括号匹配
    Linux基础知识
    操作系统
    后台面试问题
    python 面向对象
  • 原文地址:https://www.cnblogs.com/Tommy-Yu/p/5480975.html
Copyright © 2011-2022 走看看