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图像处理之镜像实现方法
May 30 Python
python编程开发之类型转换convert实例分析
Nov 13 Python
深入了解Python数据类型之列表
Jun 24 Python
Python中矩阵库Numpy基本操作详解
Nov 21 Python
Python实现的建造者模式示例
Aug 06 Python
python实现公司年会抽奖程序
Jan 22 Python
Python利用lxml模块爬取豆瓣读书排行榜的方法与分析
Apr 15 Python
利用python实现冒泡排序算法实例代码
Dec 01 Python
TensorFlow 多元函数的极值实例
Feb 10 Python
python代码实现TSNE降维数据可视化教程
Feb 28 Python
Pytorch损失函数nn.NLLLoss2d()用法说明
Jul 07 Python
用 Python 元类的特性实现 ORM 框架
May 19 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
收音机指标测试方法及仪器
2021/03/01 无线电
php查询whois信息的方法
2015/06/08 PHP
JavaScript 克隆数组最简单的方法
2009/02/12 Javascript
从零开始学习jQuery (十) jQueryUI常用功能实战
2011/02/23 Javascript
Prototype源码浅析 String部分(二)
2012/01/16 Javascript
ajax不执行success回调而是执行了error回调
2012/12/10 Javascript
基于JavaScript自定义构造函数的详解说明
2013/04/24 Javascript
js单向链表的具体实现实例
2013/06/21 Javascript
Extjs NumberField后面加单位实现思路
2013/07/30 Javascript
JavaScript中“过于”犀利地for/in循环使用示例
2013/10/22 Javascript
JavaScript中的apply和call函数详解
2014/07/20 Javascript
JS实现的左侧竖向滑动菜单效果代码
2015/10/19 Javascript
javascript每日必学之多态
2016/02/23 Javascript
JavaScript中的this引用(推荐)
2016/08/05 Javascript
详解Vue学习笔记进阶篇之列表过渡及其他
2017/07/17 Javascript
基于 Vue 的树形选择组件的示例代码
2017/08/18 Javascript
layui 表格的属性的显示转换方法
2018/08/14 Javascript
Python中使用动态变量名的方法
2014/05/06 Python
Django如何在不停机的情况下创建索引
2020/08/02 Python
Python中的特殊方法以及应用详解
2020/09/20 Python
英国家居用品和家居装饰品购物网站:Cox & Cox
2019/08/25 全球购物
英国羊皮鞋类领先品牌:Just Sheepskin
2019/12/12 全球购物
黑猩猩商店:The Chimp Store
2020/02/12 全球购物
shell的种类有哪些
2015/04/15 面试题
家长会学生家长演讲稿
2013/12/29 职场文书
三万活动总结
2014/04/28 职场文书
港澳通行证委托书怎么写
2014/08/02 职场文书
副校长竞聘演讲稿
2014/09/01 职场文书
餐厅感恩节活动策划方案
2014/10/11 职场文书
导游词欢迎词
2015/02/02 职场文书
2015年党员创先争优公开承诺书
2015/04/27 职场文书
死亡诗社观后感
2015/06/05 职场文书
护理培训心得体会
2016/01/22 职场文书
2016年万圣节活动个人总结
2016/04/05 职场文书
Python Django搭建文件下载服务器的实现
2021/05/10 Python
再谈python_tkinter弹出对话框创建
2022/03/20 Python