Python中反射和描述器总结


Posted in Python onSeptember 23, 2018

反射

在Python中,能够通过一个对象,找出type、class、attribute或者method的能力,成为反射。

函数与方法

内建函数:

getattr(object,name[,degault])  通过name返回object的属性值,当属性不存在,将使用default返回,如果没有default,则抛出AttributeError。Name必须为字符串。

setattr(object,name,value)  object的属性存在,则覆盖,不存在,新增。

hasattr(object,name)  判断对象是否有这个名字的属性,name必须为字符串

反射相关的魔术方法

__getattr__()

一个类的属性会按照继承关系找,如果找不到,就会执行__getattr__()方法,如果没有这个方法,就会抛出AttributeError异常表示找不到属性。

查找顺序为:

Instance.__dict__-->instance.__class__.__dict__-->继承的祖先类(直到object)的__dict__---找不到--> 调用__getattr__()

__setattr__()

可以拦截对实例属性的增加、修改操作,如果要设置生效,需要自己操作实例的__dict__

__delattr__()

可以阻止通过实例删除属性的操作,但是通过类依然可以删除属性。

__getattribute__()

实例的所有的属性访问,第一个都会调用__getattribute__方法,它阻止了属性的查找,该方法应该返回值或者抛出一个AttributeError异常

它的return值将作为属性查找的结果

如果抛出AttributeError异常,则会直接调用__gutattr__方法,因为表述属性没有找到。

__grtattribute__方法中为了避免在该方法中无限的递归,他的实现应该永远调用基类的同名方法以访问需要的任何属性,例如:object.__getattribute__(self,name)。一般不使用该方法

魔术方法

__getattr__()

当通过搜索实例、实例的类及祖先类查不到属性,就会调用此方法

__setattr__()

通过.访问实例的属性,进行增加,修改都要调用它

__delattr__()

当通过实例来删除属性时调用此方法

__getattribute__()

实例所有的属性调用都从这个方法开始

属性查找顺序:

实例调用__getattribute__() --> Instance.__dict__-->instance.__class__.__dict__-->继承的祖先类(直到object)的__dict__---找不到--> 调用__getattr__() 。

描述器:

描述器定义

在python中,一个类实现了__get__、__set__、__delete__三个方法中的任何一个方法,就是描述器。

如果仅实现了__get__,就是非数据描述符non-data descriptor

同时实现了__get__,__set__就是数据描述符 data descriptor

如果一个类的类属性设置为描述器实例,那么它被称为owner属主

属性查找顺序

实例的__dict__优先于非数据描述器,数据描述器优先于实例的__dict__

有__delete__方法有同样的效果,有了这个方法,也是数据描述器。

描述器在python中应用非常广泛,python的方法(包括staticmethod()和class method())都实现为非数据描述器,因此,实现可以重新定义和覆盖方法。这允许单个实例获取与同一个类的其他实例不同的行为。

Python中property()函数实现为一个数据描述器。

Python 相关文章推荐
python使用pil生成缩略图的方法
Mar 26 Python
Python函数可变参数定义及其参数传递方式实例详解
May 25 Python
Python实战小程序利用matplotlib模块画图代码分享
Dec 09 Python
python中使用%与.format格式化文本方法解析
Dec 27 Python
Python安装lz4-0.10.1遇到的坑
May 20 Python
对python 自定义协议的方法详解
Feb 13 Python
用vue.js组件模拟v-model指令实例方法
Jul 05 Python
使用Django搭建一个基金模拟交易系统教程
Nov 18 Python
浅谈Python type的使用
Nov 19 Python
python 生成任意形状的凸包图代码
Apr 16 Python
python 操作mysql数据中fetchone()和fetchall()方式
May 15 Python
Django DRF APIView源码运行流程详解
Aug 17 Python
python3实现爬取淘宝美食代码分享
Sep 23 #Python
ubuntu16.04制作vim和python3的开发环境
Sep 23 #Python
Python实现注册、登录小程序功能
Sep 21 #Python
用于业余项目的8个优秀Python库
Sep 21 #Python
Python 经典面试题 21 道【不可错过】
Sep 21 #Python
python使用folium库绘制地图点击框
Sep 21 #Python
在python中安装basemap的教程
Sep 20 #Python
You might like
php获取数组长度的方法(有实例)
2013/10/27 PHP
PHP的微信支付接口使用方法讲解
2019/03/08 PHP
(currentStyle)javascript为何有时用style得不到已设定的CSS的属性
2007/08/15 Javascript
JavaScript中将一个值转换为字符串的方法分析[译]
2012/09/21 Javascript
使用JS 清空File控件的路径值
2013/07/08 Javascript
Array栈方法和队列方法的特点说明
2014/01/24 Javascript
jquery自定义滚动条插件示例分享
2014/02/21 Javascript
javascript中tostring()和valueof()的用法及两者的区别
2015/11/16 Javascript
浏览器环境下JavaScript脚本加载与执行探析之动态脚本与Ajax脚本注入
2016/01/19 Javascript
Bootstrap3制作自己的导航栏
2016/05/12 Javascript
Node.js Addons翻译(C/C++扩展)
2016/06/12 Javascript
总结Node.js中的一些错误类型
2016/08/15 Javascript
JS复制对应id的内容到粘贴板(Ctrl+C效果)
2017/01/23 Javascript
Javascript中的 “&” 和 “|” 详解
2017/02/02 Javascript
jQuery实现节点的追加、替换、删除、复制功能示例
2017/07/11 jQuery
详解Vue2 添加对scss的支持
2019/01/02 Javascript
微信小程序实现的自定义分享功能示例
2019/02/12 Javascript
JS实现的自定义map方法示例
2019/05/17 Javascript
python中Pycharm 输出中文或打印中文乱码现象的解决办法
2017/06/16 Python
使用python动态生成波形曲线的实现
2019/12/04 Python
python 中的paramiko模块简介及安装过程
2020/02/29 Python
python利用opencv实现SIFT特征提取与匹配
2020/03/05 Python
python实现秒杀商品的微信自动提醒功能(代码详解)
2020/04/27 Python
pandas 像SQL一样使用WHERE IN查询条件说明
2020/06/05 Python
生物科学专业个人求职信范文
2013/12/05 职场文书
预备党员入党思想汇报
2014/01/04 职场文书
优秀员工表扬信
2014/01/17 职场文书
员工趣味活动方案
2014/08/27 职场文书
2014年工商所工作总结
2014/12/09 职场文书
课外活动实习计划
2015/01/19 职场文书
2015小学五年级班主任工作总结
2015/05/21 职场文书
毕业典礼主持词
2015/06/29 职场文书
六一活动主持词
2015/06/30 职场文书
python实现监听键盘
2021/04/26 Python
css实现左上角飘带效果的完整代码
2022/03/18 HTML / CSS
Python 视频画质增强
2022/04/28 Python