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 paramiko模块学习分享
Aug 23 Python
Django + Uwsgi + Nginx 实现生产环境部署的方法
Jun 20 Python
使用Python对微信好友进行数据分析
Jun 27 Python
python数据批量写入ScrolledText的优化方法
Oct 11 Python
解决nohup执行python程序log文件写入不及时的问题
Jan 14 Python
Python File(文件) 方法整理
Feb 18 Python
python pickle存储、读取大数据量列表、字典数据的方法
Jul 07 Python
详解用python计算阶乘的几种方法
Aug 14 Python
Scrapy框架基本命令与settings.py设置
Feb 06 Python
基于 Python 实践感知器分类算法
Jan 07 Python
Python入门基础之数字字符串与列表
Feb 01 Python
python基础之函数的定义和调用
Oct 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 Imagick获取图片RGB颜色值
2014/07/28 PHP
从零开始学YII2框架(六)高级应用程序模板
2014/08/20 PHP
php基于GD库画五星红旗的方法
2015/02/24 PHP
详解PHP实现异步调用的4种方法
2016/03/14 PHP
[原创]php求圆周率的简单实现方法
2016/05/30 PHP
laravel中命名路由的使用方法
2017/02/24 PHP
自己的js工具 Event封装
2009/08/21 Javascript
vue.js将unix时间戳转换为自定义时间格式
2017/01/03 Javascript
bootstrap插件treeview实现全选父节点下所有子节点和反选功能
2017/07/21 Javascript
用JavaScript做简易的购物车的代码示例
2017/10/20 Javascript
使用express+multer实现node中的图片上传功能
2018/02/02 Javascript
node.js基础知识小结
2018/02/26 Javascript
详解微信小程序回到顶部的两种方式
2019/05/09 Javascript
javascript实现简易数码时钟
2020/03/30 Javascript
vue使用微信扫一扫功能的实现代码
2020/04/11 Javascript
通过实例了解Nodejs模块系统及require机制
2020/07/16 NodeJs
通过vue刷新左侧菜单栏操作
2020/08/06 Javascript
python使用tensorflow保存、加载和使用模型的方法
2018/01/31 Python
Windows下的Python 3.6.1的下载与安装图文详解(适合32位和64位)
2018/02/21 Python
Python图像处理之颜色的定义与使用分析
2019/01/03 Python
解决python Markdown模块乱码的问题
2019/02/14 Python
python执行scp命令拷贝文件及文件夹到远程主机的目录方法
2019/07/08 Python
Python Json数据文件操作原理解析
2020/05/09 Python
python设置表格边框的具体方法
2020/07/17 Python
elf彩妆英国官网:e.l.f. Cosmetics英国(美国平价彩妆品牌)
2017/11/02 全球购物
女士时装鞋:Chinese Laundry
2018/08/29 全球购物
Book Depository美国:全球领先的专业网上书店之一
2019/08/14 全球购物
经济学博士求职自荐信范文
2013/11/23 职场文书
竞争上岗演讲稿
2014/01/05 职场文书
数控专业毕业生求职信
2014/06/12 职场文书
2015年暑期社会实践方案
2015/07/14 职场文书
2015年学校消防安全工作总结
2015/10/14 职场文书
《梅花魂》教学反思
2016/02/18 职场文书
创业计划之特色精品店
2019/08/12 职场文书
解析redis hash应用场景和常用命令
2021/08/04 Redis
「天才王子的赤字国家重生术」妮妮姆·拉雷粘土人开订
2022/03/21 日漫