自定义属性的访问 - 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. 你还不会Git?那就不要写代码了(一)

    Git应用开发学习 如果你还不会使用Git,那就不要写代码了. 一旦你会使用了Git,就再也不想使用SVN了.永远也回不去了. Mac上使用Git,肯定离不开对Mac上的操作.就要使用常用的Linux ...

  2. BigDecimal的加减乘除,比较,小数保留

    关于BigDecimal的一些常用基本操作记录 1        BigDecimal b1 = new BigDecimal("1.124"); 2        BigDeci ...

  3. 【UEFI&BIOS】---BIOS开机串口报"ERROR: C2:V1050007 IO 93B80003-9FB3-11D4-9A3A-0090273FC14D 6413FA18"的分析

    intel的X86 CPU对运行错误的处理已经做的非常完善了,一般即使是开机卡死,跑飞等各种问题也会丢给你相关的提示信息,那么掌握这种错误的分析手段就显得至关重要.在实际开发的过程中,我遇到了一个错误 ...

  4. Flutter全面屏适配

    笔者在这篇文章ReactNative全面屏(Android)适配问题提及了现在的全面屏问题,不仅是Android平台,IOS平台也是,给我的感觉就是手机越来越长了. 现在的手机长宽比早就不是之前的16 ...

  5. JsonResponse和HttpResponse

    1.联系 JsonResponse继承HttpResponse 2.区别 JsonResponse 数据类型装自动换成json字符串并相应到前端,传到前端的是数据类型而非json字符串 HttpRes ...

  6. Java电商支付系统实战(一)- 简介

    现如今,支付成为热点 对于电商业务,这都是不可或缺的 核心功能剖析 下单->支付 nginx 将用户请求反向代理到我们编写的电商系统 = 下单 之后,点击支付跳转到支付系统,最后对接 通过跳转将 ...

  7. Java入门 - 语言基础 - 05.基本数据类型

    原文地址:http://www.work100.net/training/java-basic-datatype.html 更多教程:光束云 - 免费课程 基本数据类型 序号 文内章节 视频 1 概述 ...

  8. 《爬虫学习》(二)(urllib库使用)

    urllib库是Python中一个最基本的网络请求库.可以模拟浏览器的行为,向指定的服务器发送一个请求,并可以保存服务器返回的数据. 1.urlopen函数: 在Python3的urllib库中,所有 ...

  9. 【洛谷4424】[HNOI_AHOI2018]寻宝游戏(我也不知道括号里该写啥)

    题目 洛谷 4424 分析 感觉思路比较神仙. 对于按位与和按位或两种运算,显然每一位是独立的,可以分开考虑. 对于某一位,「与 \(0\)」会将这一位变成 \(0\),「或 \(1\)」会将这一位变 ...

  10. 玩转Django2.0---Django笔记建站基础十一(二)((音乐网站开发))

    11.5 歌曲排行榜 歌曲排行榜是通过首页的导航链接进入的,按照歌曲的播放次数进行降序显示.从排行榜页面的设计图可以看到,网页实现三个功能:网页顶部搜索.歌曲分类筛选和歌曲信息列表,其说明如下: 1. ...