使用特性以保持简单

内置的 property 类创建的其实是覆盖型描述符,__set__ 方法和__get__ 方法都实现了,即便不定义设值方法也是如此。

特性的__set__ 方法默认抛出 AttributeError: can't set attribute,因此创建只读属性最简单的方式是使用特性,这能避免下一条所述的问题。

只读描述符必须有 __set__ 方法

如果使用描述符类实现只读属性,要记住,__get__ 和 __set__两个方法必须都定义,否则,实例的同名属性会遮盖描述符。

只读属性的 __set__ 方法只需抛出 AttributeError 异常,并提供合适的错误消息

用于验证的描述符可以只有 __set__ 方法

对仅用于验证的描述符来说,__set__ 方法应该检查 value 参数获得的值,如果有效,使用描述符实例的名称为键,直接在实例的
__dict__ 属性中设置。这样,从实例中读取同名属性的速度很快,因为不用经过 __get__ 方法处理。

仅有 __get__ 方法的描述符可以实现高效缓存

如果只编写了 __get__ 方法,那么创建的是非覆盖型描述符。这种描述符可用于执行某些耗费资源的计算,然后为实例设置同名属性,缓存结果。
同名实例属性会遮盖描述符,因此后续访问会直接从实例的__dict__ 属性中获取值,而不会再触发描述符的 __get__ 方法。

非特殊的方法可以被实例属性遮盖

由于函数和方法只实现了 __get__ 方法,它们不会处理同名实例属性的赋值操作。因此,像 my_obj.the_method = 7 这样简单赋值之后,后续通过该实例访问 the_method 得到的是数字 7——但是不影响类或其他实例。然而,特殊方法不受这个问题的影响。解释器只会在类中寻找特殊的方法,也就是说,repr(x) 执行的其实是x.__class__.__repr__(x),因此 x 的 __repr__ 属性对 repr(x) 方
法调用没有影响。出于同样的原因,实例的 __getattr__ 属性不会破坏常规的属性访问规则。

描述符的文档字符串和覆盖删除操作

最新文章

  1. Yocto开发笔记之《Tip-bitbake常用命令》(QQ交流群:519230208)
  2. 从零开始学习Node.js例子四 多页面实现数学运算 续二(client端和server端)
  3. JSP取得绝对路径
  4. zookeeper理论
  5. Selenium2学习-033-WebUI自动化实战实例-031-页面快照截图应用之二 -- 区域截图
  6. osgearth+vs2010安装
  7. c#中如何不通过后台直接用js筛选gridview中的数据条件筛选查询?
  8. MVC 页面跳转
  9. codeforces 678E Another Sith Tournament 概率dp
  10. careercup-排序和查找 11.7
  11. 引入的iframe是跨域的, 如何控制其高度
  12. (二)跟我一起玩Linux网络服务:BIND的自动部署(附上完整的代码)
  13. oracle数据块的大小
  14. JS脚本验证大全
  15. 小白学爬虫-批量部署Splash负载集群
  16. 【codeforces 718 C&D】C. Sasha and Array&D. Andrew and Chemistry
  17. openlayers4 入门开发系列之聚合图篇(附源码下载)
  18. [LeetCode] Magic Squares In Grid 网格中的神奇正方形
  19. audio google play()
  20. 第六周助教工作总结——NWNU李泓毅

热门文章

  1. 用Springboot干掉IBM的WAS-为公司省点钱
  2. numpy中的浅复制和深复制
  3. 一文梳理JS事件
  4. YII2.0安装教程,数据库配置前后台
  5. scanf中的%[^\n]%*c格式
  6. 2.K8S的核心资源管理方法
  7. Beta冲刺总结随笔
  8. Spring Boot 系列
  9. netty--helloword程序
  10. 使用java类的方式配置spring 需要什么注解?