python描述器
2024-08-26 16:24:36
描述器定义
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__是空的,实际上是没有优先级高低这个概念的
最新文章
- 【转】Entity Framework技术系列之7:LINQ to Entities
- (转)SQL Server 性能调优(cpu)
- 【11-23】window常用知识
- 关于struts2中表单提交时,中文乱码问题的解决
- Head First Design Patterns
- iOS项目的目录结构和开发流程
- The Ninth Hunan Collegiate Programming Contest (2013) Problem I
- -AC自动机-题表
- bom头惹的祸!
- OSCHina技术导向:Java模板引擎velocity
- zoj 3659 并检查集合
- Spring MVC核心技术
- .Net Core 学习之路-基础
- 领域驱动设计和Spring
- Ext中setVersion和getVersion
- koa中间件机制详解
- 【java】JDK与JRE的区别
- 修改linux swap空间的swappiness,降低对硬盘的缓存
- 学习推荐-Redis学习手册
- gulp前端自动化环境搭建详解