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使用scrapy采集数据过程中放回下载过大页面的方法
Apr 08 Python
Python数据类型详解(二)列表
May 08 Python
Python json 错误xx is not JSON serializable解决办法
Mar 15 Python
利用Python暴力破解zip文件口令的方法详解
Dec 21 Python
python numpy 显示图像阵列的实例
Jul 02 Python
Python 实现某个功能每隔一段时间被执行一次的功能方法
Oct 14 Python
如何使用Python标准库进行性能测试
Jun 25 Python
python3.7实现云之讯、聚合短信平台的短信发送功能
Sep 26 Python
提取视频中的音频 Python只需要三行代码!
May 10 Python
Python List remove()实例用法详解
Aug 02 Python
python实现层次聚类的方法
Nov 01 Python
Python用tkinter实现自定义记事本的方法详解
Mar 31 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
如何将数据从文本导入到mysql
2006/10/09 PHP
php学习之 循环结构实现代码
2011/06/09 PHP
php+xml实现在线英文词典之添加词条的方法
2015/01/23 PHP
JavaScript XML实现两级级联下拉列表
2008/11/10 Javascript
Javascript中正则表达式的全局匹配模式分析
2011/04/26 Javascript
js用Date对象处理时间实现思路及代码
2013/01/31 Javascript
jquery实现鼠标拖拽滑动效果来选择数字的方法
2015/05/04 Javascript
JavaScript面对国际化编程时的一些建议
2015/06/24 Javascript
JS数组去掉重复数据只保留一条的实现代码
2016/08/11 Javascript
深入理解vue中的$set
2017/06/01 Javascript
带你快速理解javascript中的事件模型
2017/08/14 Javascript
[01:12]DOTA2 2015年秋季互动指南
2015/11/10 DOTA
Python中使用strip()方法删除字符串中空格的教程
2015/05/20 Python
Python简明入门教程
2015/08/04 Python
Python中matplotlib中文乱码解决办法
2017/05/12 Python
Python序列循环移位的3种方法推荐
2018/04/09 Python
Python中if elif else及缩进的使用简述
2018/05/31 Python
python微信公众号之关键词自动回复
2018/06/15 Python
Python实现连接MySql数据库及增删改查操作详解
2019/04/16 Python
简单了解python PEP的一些知识
2019/07/13 Python
Python 将json序列化后的字符串转换成字典(推荐)
2020/01/06 Python
python数据预处理方式 :数据降维
2020/02/24 Python
HTML5边玩边学(2)基础绘图实现方法
2010/09/21 HTML / CSS
爱尔兰橄榄球店:Irish Rugby Store
2019/12/05 全球购物
医学检验专业大学生求职信
2013/11/18 职场文书
质检部经理岗位职责
2014/02/19 职场文书
教师党员承诺书
2014/03/25 职场文书
县委常委班子对照检查材料思想汇报
2014/09/28 职场文书
2015年度质量工作总结报告
2015/04/27 职场文书
第一节英语课开场白
2015/06/01 职场文书
对Golang中的FORM相关字段理解
2021/05/02 Golang
logback 实现给变量指定默认值
2021/08/30 Java/Android
AJAX实现省市县三级联动效果
2021/10/16 Javascript
MySQL数据库10秒内插入百万条数据的实现
2021/11/01 MySQL
为Centos安装指定版本的Docker
2022/04/01 Servers
mysql 乱码 字符集latin1转UTF8
2022/04/19 MySQL