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发送伪造的arp请求
Jan 09 Python
详解python 字符串和日期之间转换 StringAndDate
May 04 Python
详谈pandas中agg函数和apply函数的区别
Apr 20 Python
详解Python3中setuptools、Pip安装教程
Jun 18 Python
Python 运行.py文件和交互式运行代码的区别详解
Jul 02 Python
在windows下使用python进行串口通讯的方法
Jul 02 Python
tesserocr与pytesseract模块的使用方法解析
Aug 30 Python
python数据处理之如何选取csv文件中某几行的数据
Sep 02 Python
python实发邮件实例详解
Nov 11 Python
Pytorch实现基于CharRNN的文本分类与生成示例
Jan 08 Python
Python接口测试文件上传实例解析
May 22 Python
pytorch损失反向传播后梯度为none的问题
May 12 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/02/23 PHP
计算php页面运行时间的函数介绍
2013/07/01 PHP
php生成扇形比例图实例
2013/11/06 PHP
thinkphp模板输出技巧汇总
2014/11/24 PHP
迁移PHP版本到PHP7
2015/02/06 PHP
php简单计算页面加载时间的方法
2015/06/19 PHP
php类的定义与继承用法实例
2015/07/07 PHP
使用PHP进行微信公众平台开发的示例
2015/08/21 PHP
如果文字过长,则将过长的部分变成省略号显示
2006/06/26 Javascript
JavaScript中json使用自己总结
2013/08/13 Javascript
JS组件Bootstrap Select2使用方法解析
2016/05/30 Javascript
BootStrap无限级分类(无限极分类封装版)
2016/08/26 Javascript
jQuery模拟Marquee实现无缝滚动效果完整实例
2016/09/29 Javascript
js上传图片预览的实现方法
2017/05/09 Javascript
微信小程序实现人脸检测功能
2018/05/25 Javascript
小程序实现五星点评效果
2018/11/03 Javascript
express+vue+mongodb+session 实现注册登录功能
2018/12/06 Javascript
关于Vue Router中路由守卫的应用及在全局导航守卫中检查元字段的方法
2018/12/09 Javascript
浅谈javascript中的prototype和__proto__的理解
2019/04/07 Javascript
layui 弹出删除确认界面的实例
2019/09/06 Javascript
Javascript实现简易天数计算器
2020/05/18 Javascript
js+css实现扇形导航效果
2020/08/18 Javascript
vue-calendar-component 封装多日期选择组件的实例代码
2020/12/04 Vue.js
python原始套接字编程示例分享
2014/02/21 Python
Python正则表达式非贪婪、多行匹配功能示例
2017/08/08 Python
python标准库OS模块详解
2020/03/10 Python
利用python为PostgreSQL的表自动添加分区
2021/01/18 Python
canvas如何实现多张图片编辑的图片编辑器
2020/03/10 HTML / CSS
美国内衣品牌:Leonisa
2016/08/14 全球购物
Canal官网:巴西女性时尚品牌
2019/10/16 全球购物
Java中各种基本数据类型的默认值都是什么
2016/12/22 面试题
新郎婚宴答谢词
2014/01/19 职场文书
科级干部考察材料
2014/02/15 职场文书
《小鹰学飞》教学反思
2014/04/23 职场文书
祝酒词范文
2015/08/12 职场文书
创业计划书之外语培训班
2019/11/02 职场文书