直接上代码

>>> 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

谢谢!

转载于:https://www.cnblogs.com/Tommy-Yu/p/5480975.html

__getattr__ 与动态属性相关推荐

  1. python property setter_Python:动态属性 property setter 以及 __getattr__ 属性

    1. property 引言: -- 假设有这样一个需求,我们需要创建一个 User 类,并初始化 birthday 参数,之后根据 birthday 计算得到年龄: -- 我们设计下面的代码实现该需 ...

  2. Python类的自定义属性访问及动态属性设置

    本文主要介绍python类的一些自定义属性访问的方法,以及类的动态属性设置即python的内置函数setattr(). 自定义属性访问 ​ 什么是属性?下面的例子a和b是属性吗?不是,他们是全局变量, ...

  3. python元编程之使用动态属性实现定制类--特殊方法__setattr__,__getattribute__篇

    问题:实现一个类,要求行为如同namedtuple:只存在给定名称的属性,不允许动态添加实例属性. 主要知识点在于: __setattr__,__getattr__,getattribute__,__ ...

  4. 读书笔记:《流畅的Python》第19章 动态属性和特性

    # 第19章 动态属性和特性""" 属性(attribute):数据的属性和处理数据的方法统称属性,方法只是可调用的属性. 特性(property)除此之外,我们海可以创 ...

  5. python __setattr__ , __getattr__

    Python Class 对象或类型通过内置成员 __dict__ 来存储成员信息. 我们还可以通过重载 __getattr__ 和 __setattr__ 来拦截对成员的访问,需要注意的是 __ge ...

  6. python getattr_python __getattr__ 巧妙应用

    在之前的文章有提到__getattr__函数的作用: 如果属性查找(attribute lookup)在实例以及对应的类中(通过__dict__)失败, 那么会调用到类的__getattr__函数, ...

  7. __getattribute__()、__getattr__()、__setattr__()、__delattr__()

    访问顺序: 实例的__getattribute__().Descriptor的__get__().实例的__dict__.只读Descriptor的__get__().实例的__getattr__() ...

  8. 【7.2】__getattr__、__getattribute__魔法函数

    1 #!/user/bin/env python 2 # -*- coding:utf-8 -*- 3 # __getattr__.__getattribute__ 4 # __getattr__ 就 ...

  9. python五十二:__setattr__,__delattr__,__getattr__方法

    class Foo:def __init__(self,x):self.x = xdef __getattr__(self, item):print("执行了getattr方法") ...

最新文章

  1. C# 温故而知新:Stream篇(二)
  2. 是什么优化让 .NET Core 性能飙升?
  3. mormot数据库连接+查询+序列为JSON
  4. 二十五、深入Java中的static静态修饰符
  5. 有关 AI 人才的 6 个真相
  6. CSS的position属性:relative和absolute
  7. R语言处理非线性回归模型C-D方程,使用R语言进行多项式回归、非线性回归模型曲线拟合...
  8. 列表应用(导航菜单)
  9. 【机器学习】监督学习--(回归)多项式回归
  10. Andriod Studio 使用心得,持续更新中
  11. anaconda同时集成Python2 和 Python3
  12. python 条件判断和循环
  13. cacti监控mysql
  14. LINUX安装中文字体SimHei
  15. 思科ASDM导入与实战配置经验总结-操作系统版本V842
  16. 控制台出现 Page “xxx“ has not been registered yet 和 uniapp的报错Uncaught Error: Module build fail xxx
  17. Ubuntu20.04配置NTP服务器
  18. Ubuntu14.04 ec20 4G模块 ppp拨号--rt3070 wifi模块释放sofAP
  19. littlevgl技术参考手册_树莓派littlevGL系列教程:littlevGL简单了解
  20. C语言中的switch详解

热门文章

  1. MariaDB Spider分库分表引擎调研
  2. IT人母亲的美国之行(7)
  3. java命令行生成jar_命令行生成可执行的jar包
  4. Xilinx基于模型的设计工具—Model Composer
  5. 在ubuntu10.04上安装永中office2010
  6. 查看python安装路径以及pip安装的包
  7. 在电脑上实现手机app抓包
  8. lc412. Fizz Buzz
  9. 【相关性搜索】 多字段搜索的两种方式——词中心与字段中心
  10. linux增加自定义path和manpath