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选择排序、冒泡排序、合并排序代码实例
Apr 10 Python
Python3实现将文件树中所有文件和子目录归档到tar压缩文件的方法
May 22 Python
python 信息同时输出到控制台与文件的实例讲解
May 11 Python
Python3实现爬虫爬取赶集网列表功能【基于request和BeautifulSoup模块】
Dec 05 Python
对python同一个文件夹里面不同.py文件的交叉引用方法详解
Dec 15 Python
对Python3之进程池与回调函数的实例详解
Jan 22 Python
用python wxpy管理微信公众号并利用微信获取自己的开源数据
Jul 30 Python
python+opencv3生成一个自定义纯色图教程
Feb 19 Python
10个python3常用排序算法详细说明与实例(快速排序,冒泡排序,桶排序,基数排序,堆排序,希尔排序,归并排序,计数排序)
Mar 17 Python
Python轻量级web框架bottle使用方法解析
Jun 13 Python
Python使用requests模块爬取百度翻译
Aug 25 Python
Python基础之进程详解
May 21 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连接数超过限制的解决方法
2011/07/17 PHP
使用php发送有附件的电子邮件-(PHPMailer使用的实例分析)
2013/04/26 PHP
php 解决substr()截取中文字符乱码问题
2016/07/18 PHP
Smarty模板常见的简单应用分析
2016/11/15 PHP
phpMyAdmin无法登陆的解决方法
2017/04/27 PHP
javascript 进阶篇1 正则表达式,cookie管理,userData
2012/03/14 Javascript
js展开闭合效果演示代码
2013/07/24 Javascript
JavaScript获取路径设计源码
2014/05/22 Javascript
轻松创建nodejs服务器(3):代码模块化
2014/12/18 NodeJs
jquery图片倾斜层叠切换特效代码分享
2015/08/27 Javascript
JS+CSS实现精美的二级导航效果代码
2015/09/17 Javascript
使用jquery实现鼠标滑过弹出更多相关信息层附源码下载
2015/11/23 Javascript
jstree单选功能的实现方法
2017/06/07 Javascript
jquery的$().each和$.each的区别
2019/01/18 jQuery
JSX在render函数中的应用详解
2019/09/04 Javascript
layui框架与SSM前后台交互的方法
2019/09/12 Javascript
Vue的双向数据绑定实现原理解析
2020/02/17 Javascript
[01:46]DOTA2上海特锦赛小组赛英文解说KotlGuy采访
2016/02/27 DOTA
python Matplotlib画图之调整字体大小的示例
2017/11/20 Python
python3第三方爬虫库BeautifulSoup4安装教程
2018/06/19 Python
python添加模块搜索路径和包的导入方法
2019/01/19 Python
基于python实现模拟数据结构模型
2020/06/12 Python
phonegap常用事件总结(必看篇)
2017/03/31 HTML / CSS
Omio意大利:全欧洲低价大巴、火车和航班搜索和比价
2017/12/02 全球购物
匡威爱尔兰官网:Converse爱尔兰
2019/06/09 全球购物
什么是Linux虚拟文件系统VFS
2012/01/31 面试题
ruby如何进行集成操作?Ruby能进行多重继承吗?
2013/10/16 面试题
计算机专业应届毕业生自荐信
2013/09/26 职场文书
音乐专业应届生教师求职信
2013/11/04 职场文书
幼儿教师国培感言
2014/02/19 职场文书
售后服务承诺书
2014/03/26 职场文书
文科毕业生自荐书范文
2014/04/17 职场文书
公司年会策划方案
2014/05/17 职场文书
自愿离婚协议书2015
2015/01/26 职场文书
植物园观后感
2015/06/11 职场文书
深入理解mysql事务隔离级别和存储引擎
2022/04/12 MySQL