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+matplotlib+numpy绘制精美的条形统计图
Jan 02 Python
python 发送和接收ActiveMQ消息的实例
Jan 30 Python
python实现向微信用户发送每日一句 python实现微信聊天机器人
Mar 27 Python
Python read函数按字节(字符)读取文件的实现
Jul 03 Python
django做form表单的数据验证过程详解
Jul 26 Python
Django命名URL和反向解析URL实现解析
Aug 09 Python
简单介绍django提供的加密算法
Dec 18 Python
多个python文件调用logging模块报错误
Feb 12 Python
解决json中ensure_ascii=False的问题
Apr 03 Python
python使用nibabel和sitk读取保存nii.gz文件实例
Jul 01 Python
Python线程池与GIL全局锁实现抽奖小案例
Apr 13 Python
Python 第三方库 openpyxl 的安装过程
Dec 24 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 中的批处理的实现
2007/06/14 PHP
PHP 常用函数库和一些实用小技巧
2009/01/01 PHP
ThinkPHP5实现作业管理系统中处理学生未交作业与已交作业信息的方法
2016/11/12 PHP
php模拟实现斗地主发牌
2020/04/22 PHP
js null,undefined,字符串小结
2010/08/21 Javascript
JavaScript将相对地址转换为绝对地址示例代码
2013/07/19 Javascript
jQuery实现用户注册的表单验证示例
2013/08/28 Javascript
Jquery 改变radio/checkbox选中状态,获取选中的值(示例代码)
2013/12/12 Javascript
Javascript自定义函数判断网站访问类型是PC还是移动终端
2014/01/10 Javascript
JavaScript变量声明详解
2014/11/27 Javascript
jQuery中:file选择器用法实例
2015/01/04 Javascript
javascript的switch用法注意事项分析
2015/02/02 Javascript
js中函数声明与函数表达式
2015/06/03 Javascript
JavaScript中iframe实现局部刷新的几种方法汇总
2016/01/06 Javascript
基于javascript实现精确到毫秒的倒计时限时抢购
2016/04/17 Javascript
JS点击缩略图整屏居中放大图片效果
2017/07/04 Javascript
javascript中一些奇葩的日期换算方法总结
2018/11/14 Javascript
使用node搭建自动发图文微博机器人的方法
2019/03/22 Javascript
Vue实现固定定位图标滑动隐藏效果
2019/05/30 Javascript
使用Python发送各种形式的邮件的方法汇总
2015/11/09 Python
用yum安装MySQLdb模块的步骤方法
2016/12/15 Python
python求质数的3种方法
2018/09/28 Python
使用python批量化音乐文件格式转换的实例
2019/01/09 Python
详解Python函数式编程—高阶函数
2019/03/29 Python
浅谈python的输入输出,注释,基本数据类型
2019/04/02 Python
Python使用Tkinter实现滚动抽奖器效果
2020/01/06 Python
python wav模块获取采样率 采样点声道量化位数(实例代码)
2020/01/22 Python
解决pyecharts运行后产生的html文件用浏览器打开空白
2020/03/11 Python
Python+PyQt5实现灭霸响指功能
2020/05/25 Python
为奢侈时尚带来了慈善元素:Olivela
2018/09/29 全球购物
微软加拿大官方网站:Microsoft Canada
2019/04/28 全球购物
培训专员岗位职责
2014/02/26 职场文书
新学期家长寄语2016
2015/12/03 职场文书
简历自我评价范文
2019/04/24 职场文书
python中redis包操作数据库的教程
2022/04/19 Python
MyBatis XPathParser解析器使用范例详解
2022/07/15 Java/Android