__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
谢谢!
转载于:https://www.cnblogs.com/Tommy-Yu/p/5480975.html
__getattr__ 与动态属性相关推荐
- python property setter_Python:动态属性 property setter 以及 __getattr__ 属性
1. property 引言: -- 假设有这样一个需求,我们需要创建一个 User 类,并初始化 birthday 参数,之后根据 birthday 计算得到年龄: -- 我们设计下面的代码实现该需 ...
- Python类的自定义属性访问及动态属性设置
本文主要介绍python类的一些自定义属性访问的方法,以及类的动态属性设置即python的内置函数setattr(). 自定义属性访问 什么是属性?下面的例子a和b是属性吗?不是,他们是全局变量, ...
- python元编程之使用动态属性实现定制类--特殊方法__setattr__,__getattribute__篇
问题:实现一个类,要求行为如同namedtuple:只存在给定名称的属性,不允许动态添加实例属性. 主要知识点在于: __setattr__,__getattr__,getattribute__,__ ...
- 读书笔记:《流畅的Python》第19章 动态属性和特性
# 第19章 动态属性和特性""" 属性(attribute):数据的属性和处理数据的方法统称属性,方法只是可调用的属性. 特性(property)除此之外,我们海可以创 ...
- python __setattr__ , __getattr__
Python Class 对象或类型通过内置成员 __dict__ 来存储成员信息. 我们还可以通过重载 __getattr__ 和 __setattr__ 来拦截对成员的访问,需要注意的是 __ge ...
- python getattr_python __getattr__ 巧妙应用
在之前的文章有提到__getattr__函数的作用: 如果属性查找(attribute lookup)在实例以及对应的类中(通过__dict__)失败, 那么会调用到类的__getattr__函数, ...
- __getattribute__()、__getattr__()、__setattr__()、__delattr__()
访问顺序: 实例的__getattribute__().Descriptor的__get__().实例的__dict__.只读Descriptor的__get__().实例的__getattr__() ...
- 【7.2】__getattr__、__getattribute__魔法函数
1 #!/user/bin/env python 2 # -*- coding:utf-8 -*- 3 # __getattr__.__getattribute__ 4 # __getattr__ 就 ...
- python五十二:__setattr__,__delattr__,__getattr__方法
class Foo:def __init__(self,x):self.x = xdef __getattr__(self, item):print("执行了getattr方法") ...
最新文章
- C# 温故而知新:Stream篇(二)
- 是什么优化让 .NET Core 性能飙升?
- mormot数据库连接+查询+序列为JSON
- 二十五、深入Java中的static静态修饰符
- 有关 AI 人才的 6 个真相
- CSS的position属性:relative和absolute
- R语言处理非线性回归模型C-D方程,使用R语言进行多项式回归、非线性回归模型曲线拟合...
- 列表应用(导航菜单)
- 【机器学习】监督学习--(回归)多项式回归
- Andriod Studio 使用心得,持续更新中
- anaconda同时集成Python2 和 Python3
- python 条件判断和循环
- cacti监控mysql
- LINUX安装中文字体SimHei
- 思科ASDM导入与实战配置经验总结-操作系统版本V842
- 控制台出现 Page “xxx“ has not been registered yet 和 uniapp的报错Uncaught Error: Module build fail xxx
- Ubuntu20.04配置NTP服务器
- Ubuntu14.04 ec20 4G模块 ppp拨号--rt3070 wifi模块释放sofAP
- littlevgl技术参考手册_树莓派littlevGL系列教程:littlevGL简单了解
- C语言中的switch详解