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画ROC曲线和AUC值计算
Sep 19 Python
详解Python 序列化Serialize 和 反序列化Deserialize
Aug 20 Python
matplotlib给子图添加图例的方法
Aug 03 Python
详解Python连接MySQL数据库的多种方式
Apr 16 Python
基于MATLAB和Python实现MFCC特征参数提取
Aug 13 Python
详解Python3迁移接口变化采坑记
Oct 11 Python
使用wxpy实现自动发送微信消息功能
Feb 28 Python
Python开发企业微信机器人每天定时发消息实例
Mar 17 Python
解决python DataFrame 打印结果不换行问题
Apr 09 Python
Python 将 QQ 好友头像生成祝福语的实现代码
May 03 Python
python UIAutomator2使用超详细教程
Feb 19 Python
Python使用Opencv打开笔记本电脑摄像头报错解问题及解决
Jun 21 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/06/03 PHP
PHP中执行cmd命令的方法
2014/10/11 PHP
PHP使用GETDATE获取当前日期时间作为一个关联数组的方法
2015/03/19 PHP
Laravel6.0.4中将添加计划任务事件的方法步骤
2019/10/15 PHP
php设计模式之中介者模式分析【星际争霸游戏案例】
2020/03/23 PHP
非常不错的一个javascript 类
2006/11/07 Javascript
JScript中使用ADODB.Stream判断文件编码的代码
2008/06/09 Javascript
20个非常棒的 jQuery 幻灯片插件和教程分享
2011/08/23 Javascript
Javascript继承(上)——对象构建介绍
2012/11/08 Javascript
jQuery getJSON()+.ashx 实现分页(改进版)
2013/03/28 Javascript
javascript实现文本域写入字符时限定字数
2014/02/12 Javascript
Highcharts 多个Y轴动态刷新数据的实现代码
2016/05/28 Javascript
javascript时间差插件分享
2016/07/18 Javascript
AngularJS中run方法的巧妙运用
2017/01/04 Javascript
Vue.js实现可排序的表格组件功能示例
2019/02/19 Javascript
优雅地使用loading(推荐)
2019/04/20 Javascript
微信小程序简单的canvas裁剪图片功能详解
2019/07/12 Javascript
解决layui-open关闭自身窗口的问题
2019/09/10 Javascript
微信小程序获取公众号文章列表及显示文章的示例代码
2020/03/10 Javascript
微信小程序使用GoEasy实现websocket实时通讯
2020/05/19 Javascript
python使用pil进行图像处理(等比例压缩、裁剪)实例代码
2017/12/11 Python
Python实现的随机森林算法与简单总结
2018/01/30 Python
pyhton列表转换为数组的实例
2018/04/04 Python
CentOS 7 安装python3.7.1的方法及注意事项
2018/11/01 Python
python 实现一次性在文件中写入多行的方法
2019/01/28 Python
基于Django快速集成Echarts代码示例
2020/12/01 Python
CSS3按钮鼠标悬浮实现光圈效果源码
2016/09/11 HTML / CSS
印度最大的旅游网站:MakeMyTrip
2016/10/05 全球购物
strlen的几种不同实现方法
2013/05/31 面试题
给儿子的表扬信
2014/01/15 职场文书
《值日生》教学反思
2014/02/17 职场文书
成绩单评语
2015/01/04 职场文书
2015年助理工程师工作总结
2015/04/03 职场文书
关于调整工作时间的通知
2015/04/24 职场文书
付款证明模板
2015/06/19 职场文书
Windows Server 2012 修改远程默认端口3389的方法
2022/04/28 Servers