描述器定义
python中,一个类实现了__get__,__set__,__delete__,三个方法中的任何一个方法就是描述器,仅实现__get__方法就是非数据描述器,同时实现__get__,__set__就是数据描述器
 
我们来看一下__get__, __set__,__delete__三个魔术方法:
object.__get__(self, instance,owner)
object.__set__(self, instance,owner)
object.__delete__(self, instance)
self 表示当前实例,调用者
instance 是owner的实例
owner 表示属性所属的类
 
先看一下这个例子:
 

执行结果:
我理解的执行顺序是,类加载的时候,类变量就会生成,所以类A会先实例化,输出init A,然后实例化了B类,B的实例调用类属性方法返回A实例的属性a的值

变化一下:
执行结果:
 

因为定义的__get__方法,类A就是一个描述器,对B类或者B类实例x属性读取,成为对A的实例的访问,就会调用__get__方法
B.x.a和b.x.a都会报错该如何处理呢?
执行结果:
这样看应该很明白了吧

再来验证一个问题:
执行结果:
可以看出只有类属性访问才会出发__get__方法,而类的实例不会触发

我们再来看一下__set__方法,回顾一下属性查找顺序,
实例查找顺序是实例的__dict__,类的__dict__,基类的__dict__
类的查找顺序是类的__dict__,基类的__dict__
执行结果
实例返回变成实例A的属性,访问到类描述器

官网给出的解释是实例的__dict__优先级高于非数据描述器,数据描述器的优先级高于实例的__dict__,
执行结果
实例的__dict__是空的,实际上是没有优先级高低这个概念的

最新文章

  1. 【转】Entity Framework技术系列之7:LINQ to Entities
  2. (转)SQL Server 性能调优(cpu)
  3. 【11-23】window常用知识
  4. 关于struts2中表单提交时,中文乱码问题的解决
  5. Head First Design Patterns
  6. iOS项目的目录结构和开发流程
  7. The Ninth Hunan Collegiate Programming Contest (2013) Problem I
  8. -AC自动机-题表
  9. bom头惹的祸!
  10. OSCHina技术导向:Java模板引擎velocity
  11. zoj 3659 并检查集合
  12. Spring MVC核心技术
  13. .Net Core 学习之路-基础
  14. 领域驱动设计和Spring
  15. Ext中setVersion和getVersion
  16. koa中间件机制详解
  17. 【java】JDK与JRE的区别
  18. 修改linux swap空间的swappiness,降低对硬盘的缓存
  19. 学习推荐-Redis学习手册
  20. gulp前端自动化环境搭建详解

热门文章

  1. day 7 -1 进程理论知识
  2. 第四周作业&&结对编程
  3. keras中TimeDistributed的用法
  4. linux audit审计(2)--audit启动
  5. Python:matplotlib绘制条形图
  6. 如何在cmd中集成git
  7. Calendar用法随笔
  8. codeforces525B
  9. MySQL的my.cnf文件(解决5.7.18下没有my-default.cnf)
  10. 傻瓜式搭建私人网络硬盘——owncloud安装指南