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语法快速入门指南
Oct 12 Python
Python对list列表结构中的值进行去重的方法总结
May 07 Python
PyQt5每天必学之日历控件QCalendarWidget
Apr 19 Python
Python3用tkinter和PIL实现看图工具
Jun 21 Python
python中copy()与deepcopy()的区别小结
Aug 03 Python
Python GUI布局尺寸适配方法
Oct 11 Python
python3.6数独问题的解决
Jan 21 Python
Python之列表实现栈的工作功能
Jan 28 Python
详解Python对JSON中的特殊类型进行Encoder
Jul 15 Python
python实现美团订单推送到测试环境,提供便利操作示例
Aug 09 Python
Django Auth用户认证组件实现代码
Oct 13 Python
Python Selenium异常处理的实例分析
Feb 28 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图像处理类代码分享
2012/01/19 PHP
深入PHP变量存储的详解
2013/06/13 PHP
PHP中strncmp()函数比较两个字符串前2个字符是否相等的方法
2016/01/07 PHP
PHP实现的构造sql语句类实例
2016/02/03 PHP
理解php依赖注入和控制反转
2016/05/11 PHP
php实现批量删除挂马文件及批量替换页面内容完整实例
2016/07/08 PHP
php实现大文件断点续传下载实例代码
2019/10/01 PHP
JavaScript中的私有成员
2006/09/18 Javascript
基于jquery的bankInput银行卡账号格式化
2012/08/22 Javascript
js实时获取系统当前时间实例代码
2013/06/28 Javascript
js实现一个猜数字游戏
2017/03/31 Javascript
关于jQuery中fade(),show()起始位置的一点小发现
2017/04/25 jQuery
浅谈Vue网络请求之interceptors实际应用
2018/02/28 Javascript
使用weixin-java-tools完成微信授权登录、微信支付的示例
2018/09/26 Javascript
js实现倒计时秒杀效果
2020/03/25 Javascript
python批量添加zabbix Screens的两个脚本分享
2017/01/16 Python
解决python 自动安装缺少模块的问题
2018/10/22 Python
python中yield的用法详解——最简单,最清晰的解释
2019/04/04 Python
python微信公众号开发简单流程实现
2020/03/09 Python
Python利用for循环打印星号三角形的案例
2020/04/12 Python
解决redis与Python交互取出来的是bytes类型的问题
2020/07/16 Python
Python logging模块handlers用法详解
2020/08/14 Python
python将数据插入数据库的代码分享
2020/08/16 Python
mac系统下安装pycharm、永久激活、中文汉化详细教程
2020/11/24 Python
NUK奶瓶美国官网:NUK美国
2016/09/26 全球购物
英国家用电器购物网站:Hughes
2018/02/23 全球购物
中国跨境电子商务网站:NewFrog
2018/03/10 全球购物
世界上最大的铁人三项商店:Tri UK
2020/11/04 全球购物
MIS软件工程师的面试题
2016/04/22 面试题
工商企业管理应届生求职信
2013/11/03 职场文书
装修设计师求职信
2014/02/26 职场文书
大学活动总结模板
2014/07/10 职场文书
乡镇防汛工作汇报
2014/10/28 职场文书
2014年平安创建工作总结
2014/11/24 职场文书
小学二年级数学教学计划
2015/01/20 职场文书
毕业纪念册寄语大全
2015/02/26 职场文书