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实现定时同步本机与北京时间的方法
Mar 24 Python
Python实现给qq邮箱发送邮件的方法
May 28 Python
使用Django的模版来配合字符串翻译工作
Jul 27 Python
教你用Python脚本快速为iOS10生成图标和截屏
Sep 22 Python
OpenCV2.3.1+Python2.7.3+Numpy等的配置解析
Jan 05 Python
python实现画圆功能
Jan 25 Python
使用Python的OpenCV模块识别滑动验证码的缺口(推荐)
May 10 Python
python跳出双层for循环的解决方法
Jun 24 Python
python接口自动化如何封装获取常量的类
Dec 24 Python
基于Python实现人脸自动戴口罩系统
Feb 06 Python
如何查看Django ORM执行的SQL语句的实现
Apr 20 Python
通过代码实例了解Python异常本质
Sep 16 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 excel类 phpExcel使用方法介绍
2010/08/21 PHP
php中使用Ajax时出现Error(c00ce56e)的详细解决方案
2014/11/03 PHP
基于PHP给大家讲解防刷票的一些技巧
2015/11/18 PHP
实例分析PHP中PHPMailer发邮件
2017/12/13 PHP
一种JavaScript的设计模式
2006/11/22 Javascript
键盘控制事件应用教程大全
2006/11/24 Javascript
javascript 一个自定义长度的文本自动换行的函数
2007/08/19 Javascript
javascript GUID生成器实现代码
2009/10/31 Javascript
动态显示可输入的字数提示还可以输入的字数
2014/04/01 Javascript
js仿百度登录页实现拖动窗口效果
2016/03/11 Javascript
基于jquery编写的放大镜插件
2016/03/23 Javascript
Vue数据驱动模拟实现3
2017/01/11 Javascript
vue动态生成dom并且自动绑定事件
2017/04/19 Javascript
bootstrap fileinput组件整合Springmvc上传图片到本地磁盘
2017/05/11 Javascript
Angular4学习教程之HTML属性绑定的方法
2018/01/04 Javascript
vue组件传值的实现方式小结【三种方式】
2020/02/05 Javascript
vue实现图片按比例缩放问题操作
2020/08/11 Javascript
强悍的Python读取大文件的解决方案
2019/02/16 Python
基于python生成器封装的协程类
2019/03/20 Python
NumPy 基本切片和索引的具体使用方法
2019/04/24 Python
Python中的四种交换数值的方法解析
2019/11/18 Python
春节到了 教你使用python来抢票回家
2020/01/06 Python
tensorboard实现同时显示训练曲线和测试曲线
2020/01/21 Python
Python requests获取网页常用方法解析
2020/02/20 Python
从零开始的TensorFlow+VScode开发环境搭建的步骤(图文)
2020/08/31 Python
使用python爬取抖音app视频的实例代码
2020/12/01 Python
html5之Canvas路径绘图、坐标变换应用实例
2012/12/26 HTML / CSS
学校后勤人员职责
2013/12/27 职场文书
《罗布泊,消逝的仙湖》教学反思
2014/03/01 职场文书
演讲稿的写法
2014/05/19 职场文书
小学语文教研活动总结
2014/07/01 职场文书
新闻专业毕业生求职信
2014/08/08 职场文书
2014年小学数学教师工作总结
2014/12/03 职场文书
银行培训心得体会范文
2016/01/09 职场文书
Python中使用subprocess库创建附加进程
2021/05/11 Python
SQL Server数据库备份和恢复数据库的全过程
2022/06/14 SQL Server