反射
在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()函数实现为一个数据描述器。
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
更新日志
- 雨林唱片《赏》新曲+精选集SACD版[ISO][2.3G]
- 罗大佑与OK男女合唱团.1995-再会吧!素兰【音乐工厂】【WAV+CUE】
- 草蜢.1993-宝贝对不起(国)【宝丽金】【WAV+CUE】
- 杨培安.2009-抒·情(EP)【擎天娱乐】【WAV+CUE】
- 周慧敏《EndlessDream》[WAV+CUE]
- 彭芳《纯色角3》2007[WAV+CUE]
- 江志丰2008-今生为你[豪记][WAV+CUE]
- 罗大佑1994《恋曲2000》音乐工厂[WAV+CUE][1G]
- 群星《一首歌一个故事》赵英俊某些作品重唱企划[FLAC分轨][1G]
- 群星《网易云英文歌曲播放量TOP100》[MP3][1G]
- 方大同.2024-梦想家TheDreamer【赋音乐】【FLAC分轨】
- 李慧珍.2007-爱死了【华谊兄弟】【WAV+CUE】
- 王大文.2019-国际太空站【环球】【FLAC分轨】
- 群星《2022超好听的十倍音质网络歌曲(163)》U盘音乐[WAV分轨][1.1G]
- 童丽《啼笑姻缘》头版限量编号24K金碟[低速原抓WAV+CUE][1.1G]