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 制作图片转pdf工具
Jan 30 Python
Python全局变量操作详解
Apr 14 Python
python使用WMI检测windows系统信息、硬盘信息、网卡信息的方法
May 15 Python
Python遍历某目录下的所有文件夹与文件路径
Mar 15 Python
在Python中使用gRPC的方法示例
Aug 08 Python
Python调用adb命令实现对多台设备同时进行reboot的方法
Oct 15 Python
Python使用scrapy爬取阳光热线问政平台过程解析
Aug 14 Python
细数nn.BCELoss与nn.CrossEntropyLoss的区别
Feb 29 Python
Python中的xlrd模块使用原理解析
May 21 Python
Python定时任务APScheduler原理及实例解析
May 30 Python
opencv-python的RGB与BGR互转方式
Jun 02 Python
linux系统下pip升级报错的解决方法
Jan 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
php环境配置 php5 mysql5 apache2 phpmyadmin安装与配置
2006/11/17 PHP
PHP令牌 Token改进版
2008/07/18 PHP
PHP连接MySQL查询结果中文显示乱码解决方法
2013/10/25 PHP
简单谈谈php中ob_flush和flush的区别
2014/11/27 PHP
详解php几行代码实现CSV格式文件输出
2017/07/01 PHP
PHP堆栈调试操作简单示例
2018/06/15 PHP
javascript之更有效率的字符串替换
2008/08/02 Javascript
JQuery中使用.each()遍历元素学习笔记
2014/11/08 Javascript
Javascript基础教程之变量
2015/01/18 Javascript
jQuery实现动态添加和删除一个div
2015/08/12 Javascript
JavaScript数据类型学习笔记分享
2016/09/01 Javascript
jQuery控制控件文本的长度的操作方法
2016/12/05 Javascript
微信小程序利用co处理异步流程的方法教程
2017/05/20 Javascript
JS设计模式之观察者模式实现实时改变页面中金额数的方法
2018/02/05 Javascript
angular6的响应式表单的实现
2018/10/10 Javascript
如何通过JS实现转码与解码
2020/02/21 Javascript
python通过colorama模块在控制台输出彩色文字的方法
2015/03/19 Python
Python @property装饰器原理解析
2020/01/22 Python
浅谈numpy中np.array()与np.asarray的区别以及.tolist
2020/06/03 Python
基于Python爬取fofa网页端数据过程解析
2020/07/13 Python
python实现简单文件读写函数
2021/02/25 Python
css3实现超立体3D图片侧翻倾斜效果
2014/04/16 HTML / CSS
html5教程画矩形代码分享
2013/12/04 HTML / CSS
无畏的旅行:Intrepid Travel
2017/12/20 全球购物
Troy-Bilt官网:草坪割草机、吹雪机、分蘖机等
2019/02/19 全球购物
C语言编程题
2015/03/09 面试题
婚礼主持词
2014/03/13 职场文书
学校安全管理责任书
2014/07/23 职场文书
陕西导游词
2015/02/04 职场文书
2015年感恩节活动总结
2015/03/24 职场文书
辩护词范文大全
2015/05/21 职场文书
学校元旦晚会开场白
2015/05/29 职场文书
民主生活会意见
2015/06/05 职场文书
财务年终工作总结大全
2019/06/20 职场文书
导游词之永泰公主墓
2019/12/04 职场文书
vue实现无缝轮播效果(跑马灯)
2021/05/14 Vue.js