自定义属性的访问 - 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. ArcEngine 数据编辑(IWorkspaceFactory)

    数据编辑做过很多次,没怎么出现问题,今天出现了问题,浪费了大半天,记录一下. 问题:修改Featrue的属性,修改后停止编辑,但是没有提示是否保存修改 原因:在编辑数据的时候没有加StartEditO ...

  2. UGUI之MaskableGraphic

    MaskableGraphic继承自Graphic,并且继承了IClippable, IMaskable, IMaterialModifier三个接口.它是RawImage.Image和Text的父类 ...

  3. mongodb的文本搜索

    1.当mongodb进程文本搜索的时候, 一个collection,只有一个文本查询的索引. 2.全文索引的定义,搜索的是有意义的词,不是字母 一开始是简单的用中文姓名的姓,如:张,来查询,但是无效, ...

  4. Tarjan强连通分量模板

    最好还是看一看下面这个网址吧 我的这篇博客里的代码更加缜密(毫无错误的神级代码)https://www.cnblogs.com/Tidoblogs/p/11315153.html https://ww ...

  5. numpy 数值的修改

    一.步骤 1.查找值 使用数组的索引和切片 2.修改值 直接赋值 例子 import numpy as np arr1 = np.arange(0, 24).reshape(4, 6) # 使用数组的 ...

  6. HBase的安装、配置与实践

    本教程运行环境是在Ubuntu-64位系统下,HBase版本为hbase-1.1.2,这是目前已经发行的已经编译好的稳定的版本,带有src的文件是未编译的版本,这里我们只要下载bin版本hbase-1 ...

  7. 1. RevitAPI 基础(上)

    一 重要的基本设置: 1. 类库:revitAPI.DLL, revitAPIUI.DLL,个人理解前者包括了revit软件所特有的数据类型及软件中存在的全部后台数据,而后者是包含了大量与实现UI交互 ...

  8. 异想家Win7系统安装的软件与配置

    C盘推荐一个硬盘,256G以上,安装好驱动,激活Win7,备份一次系统(纯净)! 1.Mac.Linux时间同步(双系统时配置): 开始->运行->CMD,打开命令行程序(以管理员方式打开 ...

  9. python数据分析常用图大集合

    目录 一.折线图 二.直方图 三.垂直条形图 四.水平条形图 五.饼图 六.箱线图 七.热力图 八.散点图 九.蜘蛛图 十.二元变量分布 十一.面积图 十二.六边形图 以下默认所有的操作都先导入了Nu ...

  10. ThinkPHP 5.0.7 + MySQL 构建RESTful API的小程序---02-ThinkPHP5中的orm的模型关联

    ThinkPHP5.0中的操作ORM的一对一,一对多,多对多的操作: 由以下表举例: banner表的设计 id name description delete_time update_time 1 ...