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制作爬虫抓取美女图
Jan 20 Python
使用Python的Flask框架构建大型Web应用程序的结构示例
Jun 04 Python
python数据结构链表之单向链表(实例讲解)
Jul 25 Python
python实现随机梯度下降(SGD)
Mar 24 Python
分数霸榜! python助你微信跳一跳拿高分
Jan 08 Python
基于python生成器封装的协程类
Mar 20 Python
python实现中文文本分句的例子
Jul 15 Python
python 检查数据中是否有缺失值,删除缺失值的方式
Dec 02 Python
Python基础之字典常见操作经典实例详解
Feb 26 Python
python+pygame实现坦克大战小游戏的示例代码(可以自定义子弹速度)
Aug 11 Python
如何利用Python写个坦克大战
Nov 18 Python
Django 用户认证Auth组件的使用
Nov 30 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/03 咖啡文化
附件名前加网站名
2008/03/23 PHP
PHP判断搜索引擎蜘蛛并自动记忆到文件的代码
2012/02/04 PHP
PHP5常用函数列表(分享)
2013/06/07 PHP
PHP扩展开发入门教程
2015/02/26 PHP
PHP实现简易blog的制作
2016/10/24 PHP
DLL+ ActiveX控件+WEB页面调用例子
2010/08/07 Javascript
分享XmlHttpRequest调用Webservice的一点心得
2012/07/20 Javascript
jquery单行文字向上滚动效果的实现代码
2014/09/05 Javascript
javascript操作Cookie(设置、读取、删除)方法详解
2015/03/18 Javascript
JavaScript更改字符串的大小写
2015/05/07 Javascript
js中 javascript:void(0) 用法详解
2015/08/11 Javascript
通过Jquery.cookie.js实现展示浏览网页的历史记录超管用
2015/10/23 Javascript
JavaScript生成验证码并实现验证功能
2016/09/24 Javascript
Angular.JS内置服务$http对数据库的增删改使用教程
2017/05/07 Javascript
基于JS实现移动端左滑删除功能
2017/07/28 Javascript
js断点调试经验分享
2017/12/08 Javascript
nodejs实现截取上传视频中一帧作为预览图片
2017/12/10 NodeJs
js异步接口并发数量控制的方法示例
2020/11/22 Javascript
关于python的bottle框架跨域请求报错问题的处理方法
2017/03/19 Python
python 获取字符串MD5值方法
2018/05/29 Python
Python多进程方式抓取基金网站内容的方法分析
2019/06/03 Python
PyQt5创建一个新窗口的实例
2019/06/20 Python
python按行读取文件并找出其中指定字符串
2019/08/08 Python
Django与pyecharts结合的实例代码
2020/05/13 Python
python如何删除列为空的行
2020/07/17 Python
Linden Leaves官网:新西兰纯净护肤品
2020/12/20 全球购物
转党组织关系介绍信
2014/01/08 职场文书
集团薪酬管理制度
2014/01/13 职场文书
党员领导干部承诺书
2014/05/28 职场文书
2014年合同管理工作总结
2014/12/02 职场文书
关于艺术节的开幕致辞
2016/03/04 职场文书
Tomcat starup.bat 脚本实现开机自启动
2022/04/20 Servers
MySQL 数据 data 基本操作
2022/05/04 MySQL
SQL Server 中的事务介绍
2022/05/20 SQL Server
nginx之queue的具体使用
2022/06/28 Servers