自定义属性的访问 - 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的更多相关文章

  1. NXP Mifare S50标准IC卡- 访问位(Access Bits) 分析

    Mifare S50 标准IC卡有1K 字节的EEPROM,主要用来存储数据和控制信息.1K 字节的EEPROM分成16 个区,每区又分成4 段,每1段中有16 个字节.每个区的最后一个段叫“尾部&q ...

  2. 访问修饰符(access modifier)。

    1)public(公共的):被 public所修饰的属性和方法可以被有类访问. 所修饰的属性和方法可以被有类访问. 2)protected (受保护的):被protected所修饰的属性和方法可以在类 ...

  3. Java 多并发之原子访问(Atomic Access)

    在编程中,一个原子操作是只会出现一次的.一个原子操作在中间不会停止:要么全部发生要么一点也不发生.我们只有在原子操作完成之后才会看到原子操作的具体影响. 甚至是非常简单的表达式能够构造分解为简单操作的 ...

  4. 如何访问局域网的Access数据库?

    1]用共享打印机来打开文件共享, 2]把Access文件.mdb所在的文件夹 共享,然后其他的就和本地一样了. 设置如下: Data Source="\\192.168.7.49\user\ ...

  5. 在MFC里面使用ADO访问微软的ACCESS数据库 实现增删改查

    声明:百度以外的公司可以自由转载该文. 正如我上一篇博文提到,ADO这货和MFC没有任何关系,ADO 是一个独立的组件.所以为了使用ADO 我们就要把ADO引入到MFC中. ADO是硬盘上的表现形式是 ...

  6. 条款15:在资源管理类中提供对原始资源的访问(Provide access to raw resources in resource-managing classes)

    NOTE: 1.APIs往往要求访问原始资源(raw resources),所以每一个RAII class应该提供一个“取得其所管理之资源”的办法. 2.对原始资源的访问可能经由显示转换或隐式转换.一 ...

  7. HTTP访问控制模块(HTTP Access)

    ·摘要这个模块提供简单的基于主机的访问控制.ngx_http_access_module这个模块可以详细的检查客户端IP,并且按顺序执行第一条匹配的规则.如下例: location / {  deny ...

  8. 访问mysql出现“Access denied for user root@localhost”(using password:NO)解决方案

    首先声明,出现这个提示的原因有很多,以下只针对我遇到的一种情况 使用解压缩版安装mysql的时候,data文件夹是自己新建的,my-default.ini也是自己配置的,这时直接启动mysql服务的时 ...

  9. 访问mysql出现Access denied for user 'root'@'的解决方法

    1.关闭mysql的服务 方法一:我的电脑右键-管理-服务和应用程序-服务,找到mysql,右键关闭 方法二:cmd进入命令提示符,service mysqld stop(这个是网上的方法,我试了一下 ...

随机推荐

  1. AI——第四次工业革命

    历史上发生了三次工业革命:第一次是以蒸汽机的发明为代表,改变了长久以来的棉纺织业,人类进入"蒸汽时代":第二次是以汽车的发明和电学的发展为代表,人类的活动范围和时长都极大地扩展,人 ...

  2. DataFrame数据合并

    一.join 作用:默认情况下,他是把行索引相同的数据合并到一起注意:以左为准,没有的部分用NaN补全 例子 import pandas as pd import numpy as np df1 = ...

  3. 第二阶段冲刺个人任务——three

    今日任务: 优化统计个人博客结果页面的显示. 昨日成果: 优化作业查询结果,按学号排列.

  4. TypeScript 源码详细解读(4)语法1-语法树

    在上一节介绍了标记的解析,就相当于识别了一句话里有哪些词语,接下来就是把这些词语组成完整的句子,即拼装标记为语法树. 树(tree) 树是计算机数据结构里的专业术语.就像一个学校有很多年级,每个年级下 ...

  5. c#移位运算符("<<"及">>")

    C#是用<<(左移) 和 >>(右移) 运算符是用来执行移位运算. 左移 (<<) 将第一个操作数向左移动第二个操作数指定的位数,空出的位置补0.  左移相当于乘. ...

  6. chrome 安装

    Centos7 yum安装chrome浏览器   跟着这个教程安装的:Centos7安装chrome浏览器 (点击) 1. 配置yum源 在目录 /etc/yum.repos.d/ 下新建文件 goo ...

  7. IdentityServer4身份认证授权入门

    一.简介 IdentityServer4 是为ASP.NET Core 系列量身打造的一款基于 OpenID Connect 和 OAuth 2.0 认证框架 特点: 1.认证服务 2.单点登录登出( ...

  8. Spring 框架初学

    一 .   spring IOC, DI: 将原来有程序员建立类的对象工作交由spring来操作: 从外部来看: 将各个类以bean 的方式配在spring容器的配置文件中(application.x ...

  9. docker启动redis端口映射错误问题解决

    今天使用docker安装redis,使用的时候出现了一些问题.第一次安装好后,在虚拟机后台启动了redis,然后在连接虚拟机的redis的时候怎么也连不上.出现这种情况我第一反应是防火墙没有开启所以我 ...

  10. Leetcode 题目整理-2 Reverse Integer && String to Integer

    今天的两道题关于基本数据类型的探讨,估计也是要考虑各种情况,要细致学习 7. Reverse Integer Reverse digits of an integer. Example1: x = 1 ...