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批量修改文件后缀的方法
Jan 26 Python
Python读写docx文件的方法
May 08 Python
Python面向对象程序设计之继承与多继承用法分析
Jul 13 Python
python判断数字是否是超级素数幂
Sep 27 Python
Python正则匹配判断手机号是否合法的方法
Dec 09 Python
Python气泡提示与标签的实现
Apr 01 Python
IntelliJ 中配置 Anaconda的过程图解
Jun 01 Python
Keras模型转成tensorflow的.pb操作
Jul 06 Python
python 写一个性能测试工具(一)
Oct 24 Python
python实现MySQL指定表增量同步数据到clickhouse的脚本
Feb 26 Python
解决PDF 转图片时丢文字的一种可能方式
Mar 04 Python
django 认证类配置实现
Nov 11 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
Linux下安装oracle客户端并配置php5.3
2014/10/12 PHP
PHP中判断文件存在使用is_file还是file_exists?
2015/04/03 PHP
分享10段PHP常用代码
2015/11/11 PHP
php实现往pdf中加数字签名操作示例【附源码下载】
2018/08/07 PHP
laravel5.6 框架邮件队列database驱动简单demo示例
2020/01/26 PHP
脚本收藏iframe
2006/07/21 Javascript
使用prototype.js进行异步操作
2007/02/07 Javascript
JS图片预加载 JS实现图片预加载应用
2012/12/03 Javascript
js使用栈来实现10进制转8进制与取除数及余数
2014/06/11 Javascript
如何高效率去掉js数组中的重复项
2016/04/12 Javascript
[原创]JS基于FileSaver.js插件实现文件保存功能示例
2016/12/08 Javascript
JS多物体实现缓冲运动效果示例
2016/12/20 Javascript
详解nodejs 文本操作模块-fs模块(四)
2016/12/22 NodeJs
js模糊查询实例分享
2016/12/26 Javascript
jQuery中DOM节点删除之empty与remove
2017/01/20 Javascript
利用Vue.js框架实现火车票查询系统(附源码)
2017/02/27 Javascript
JS jQuery使用正则表达式去空字符的简单实现代码
2017/05/20 jQuery
利用JS如何计算字符串所占字节数示例代码
2017/09/13 Javascript
JavaScript实现HTML5游戏断线自动重连的方法
2017/09/18 Javascript
详解使用VUE搭建后台管理系统(vue-cli更新至3.0)
2018/08/22 Javascript
Python中的Numpy入门教程
2014/04/26 Python
python+django加载静态网页模板解析
2017/12/12 Python
在Pycharm中自动添加时间日期作者等信息的方法
2019/01/16 Python
python判断自身是否正在运行的方法
2019/08/08 Python
Python绘制三角函数图(sin\cos\tan)并标注特定范围的例子
2019/12/04 Python
Python web如何在IIS发布应用过程解析
2020/05/27 Python
python自动打开浏览器下载zip并提取内容写入excel
2021/01/04 Python
CSS3制作彩色进度条样式的代码示例分享
2016/06/23 HTML / CSS
使用CSS3的ruby-position固定注音位置的用法示例
2016/07/05 HTML / CSS
如何在发生故障的节点上重新安装 SQL Server
2013/03/14 面试题
医学生就业推荐表自我鉴定
2014/03/26 职场文书
办公室班子四风问题对照检查材料
2014/10/04 职场文书
2015高考寄语集锦
2015/02/27 职场文书
七个非常实用的Python工具包总结
2021/06/15 Python
Python保存并浏览用户的历史记录
2022/04/29 Python
win10搭建配置ftp服务器的方法
2022/08/05 Servers