自定义属性的访问 - Customizing attribute access
自定义属性的访问 - Customizing attribute access
在 python 中, 下列方法可以实现类实例属性 instance.attribute 的 使用,设置,删除.
object.__getattr__(self, name)
找不到 attribute 的时候被调用(__dict__ 属性中找不到的时候),
例如, 所调用的 attribute 不是 instance.attribute, 或者类中没有这个 attribute,
即 self.attribute 找不到. 该方法返回的是的 attribute 的 value, 或者
raise AttributeError 异常.
Note,
如果 attribute 存在 __dict__ 中, __getattr__ 是不会被调用的.
这一点体现了 __getattr__ 与 __setattr__ 的非对称调用, 这种不
对称是 python 故意儿为之, 原因有二,
a, 为了效率的原因 - 找到 attribute 后,无需浪费资源再'向上(MRO)'查找.
b, 如果不这样做 __getattr__ 将无法访问 instance 的其他 attributes.
至少对于 instance variables 来说, 可以通过在 __dict__ 中插入变量的值来实现,
__dict__[variables] = value,从而得到对该 variables 的访问及控制(total control).
上面这样这种做法, 在 python doc 中被称为 'fake total control', 相对应的后面将
介绍的 __getattribute__ 方法被称作'actually get total control'.
object.__getattribute__(self, name)
在获取 instances.attribute 的时候无条件的被调用.
如果在 instances 所属的 class 中定义了 __getattr__ 方法, __getattr__ 将不会被调用,
除非在 __getattribute__ 方法中显示的调用 __getattr__, 或者 __getattribute__ 方法
raises AttributeError 异常.
为防止无线的递归, 调用 __getattribute__ 方法的时候应该保证始终在 instances 的基类上调用.
Note,
有种情况可能绕过此方法,即 通过 隐式调用 或 built-in 方法调用'特殊方法'的时候,
详见 '对特殊方法的访问 - Special method lookup' 一文.
http://www.cnblogs.com/zzyzz/p/7743687.html
object.__setattr__(self, name, value)
当试图设置 attributes 的时候 __setattr__ 将被调用(instances.attribute = value),
从而代替 normal mechanism - __dict__[variables] = value
当 __setattr__ 要为一个 instance 的名字为 name 的 attribute 设置成值为 value 的时候,
实际上应该保证调用的是基类的 __setattr__ 方法, object.__setattr__(self, name, value).
object.__delattr__(self, name)
跟 __setattr__ 像类似, __delattr__ 用在删除 instances.attribute 的时候.
del instances.attribute
object.__dir__(self)
当对一个对象调用 dir(object) 方法的时候 __dir__ 被调用.
返回值是一个被 list 化, 并 sort 的序列.
Summarize,
其实 Customizing attribute access 跟 descriptor 关系紧密, 是描述符协议的前提,
可以将两者放在一起学习.
Reference,
Customizing attribute access
https://docs.python.org/3/reference/datamodel.html#customizing-attribute-access
descriptors
https://docs.python.org/3/reference/datamodel.html#descriptors
自定义属性的访问 - Customizing attribute access的更多相关文章
- NXP Mifare S50标准IC卡- 访问位(Access Bits) 分析
Mifare S50 标准IC卡有1K 字节的EEPROM,主要用来存储数据和控制信息.1K 字节的EEPROM分成16 个区,每区又分成4 段,每1段中有16 个字节.每个区的最后一个段叫“尾部&q ...
- 访问修饰符(access modifier)。
1)public(公共的):被 public所修饰的属性和方法可以被有类访问. 所修饰的属性和方法可以被有类访问. 2)protected (受保护的):被protected所修饰的属性和方法可以在类 ...
- Java 多并发之原子访问(Atomic Access)
在编程中,一个原子操作是只会出现一次的.一个原子操作在中间不会停止:要么全部发生要么一点也不发生.我们只有在原子操作完成之后才会看到原子操作的具体影响. 甚至是非常简单的表达式能够构造分解为简单操作的 ...
- 如何访问局域网的Access数据库?
1]用共享打印机来打开文件共享, 2]把Access文件.mdb所在的文件夹 共享,然后其他的就和本地一样了. 设置如下: Data Source="\\192.168.7.49\user\ ...
- 在MFC里面使用ADO访问微软的ACCESS数据库 实现增删改查
声明:百度以外的公司可以自由转载该文. 正如我上一篇博文提到,ADO这货和MFC没有任何关系,ADO 是一个独立的组件.所以为了使用ADO 我们就要把ADO引入到MFC中. ADO是硬盘上的表现形式是 ...
- 条款15:在资源管理类中提供对原始资源的访问(Provide access to raw resources in resource-managing classes)
NOTE: 1.APIs往往要求访问原始资源(raw resources),所以每一个RAII class应该提供一个“取得其所管理之资源”的办法. 2.对原始资源的访问可能经由显示转换或隐式转换.一 ...
- HTTP访问控制模块(HTTP Access)
·摘要这个模块提供简单的基于主机的访问控制.ngx_http_access_module这个模块可以详细的检查客户端IP,并且按顺序执行第一条匹配的规则.如下例: location / { deny ...
- 访问mysql出现“Access denied for user root@localhost”(using password:NO)解决方案
首先声明,出现这个提示的原因有很多,以下只针对我遇到的一种情况 使用解压缩版安装mysql的时候,data文件夹是自己新建的,my-default.ini也是自己配置的,这时直接启动mysql服务的时 ...
- 访问mysql出现Access denied for user 'root'@'的解决方法
1.关闭mysql的服务 方法一:我的电脑右键-管理-服务和应用程序-服务,找到mysql,右键关闭 方法二:cmd进入命令提示符,service mysqld stop(这个是网上的方法,我试了一下 ...
随机推荐
- cogs 176. [USACO Feb07] 奶牛聚会 dijkstra
176. [USACO Feb07] 奶牛聚会 ★☆ 输入文件:sparty.in 输出文件:sparty.out 简单对比时间限制:3 s 内存限制:16 MB 译: zqzas N ...
- hdfs断电报错解决
一,/home/hadoop/tmp/dfs/name/current 目录下查看文件二,1.stop hadoop所有的服务;2.重新格式化namenode即可: hadoop根目录下: hadoo ...
- Xcode10:library not found for -lstdc++.6.0.9 临时解决
1.https://pan.baidu.com/s/1IkbZb6qaxgvghP1HEFQa6w?errno=0&errmsg=Auth%20Login%20Sucess&& ...
- git 其它补充(版本)
1.给源码贡献力量(当自己比较牛逼时) pull request 2..gitignore文件 在创建仓库的时候可以进行设置 3.版本 git tag -a v1.0 -m '版本介绍' 本地创建Ta ...
- [LOJ#2017][轮廓线DP][KMP]「SCOI2016」围棋
题目传送门 看到 \(m\le 12\) 和 \(c\le 6\) ,容易想到状压 DP 考虑转化成 \(3^{nm}\) 减去不合法的方案数,轮廓线 DP :\(f[i][j][S][k][h]\) ...
- [apue] 使用 Ctrl+S停止输出而不用挂起前台进程
之前一直知道使用 Ctrl+Z 挂起前台进程来阻止进程运行,之后可以再通过 shell 的作业控制 (jobs / fg N) 来将后台进程切换为前台,从而继续运行. 最近学到一种新的方法,对于不停有 ...
- react元素获取e时,点击target为空的现象
今天呢,学习react过程中,我要获取一个元素的e, checkAll=(e)=>{ console.log(e) console.log(e.target) } render() { retu ...
- 从DirectX SDK升级到Windows SDK
原来的DirectX SDK到June 2010,微软就不更新了.之后新的版本被集成到了Windows SDK中. 在微软的博客里找到一篇升级指南:http://blogs.msdn.com/b/ch ...
- selenium,测试套件的使用
学习 selenium-webdriver 已经一段时间了,最近学习到,测试用例的批量执行,和测试套件的使用,有点自己的理解,不晓得对不对,希望大家指正! 写一个测试用例 baidu.py c ...
- Docker和Kubernetes
Docker和Kubernetes Docker Docker是一个容器的开放平台,但它不是最早的.自20世纪70年代以来,容器平台一直存在.他们的开发可以追溯到Unix中的chroot系统调用.在2 ...