Python中反射和描述器总结
admin
2023-07-19 15:42:48
0

反射

在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()函数实现为一个数据描述器。


相关内容

热门资讯

有黑科技更有好价!“广货行天下... 深圳新闻网2026年6月17日讯(记者 刘惠敏 王睿)6月16日,第四届深圳国际眼镜业博览会暨202...
沈阳自动化研究所提出AI驱动核... 上证报中国证券网讯(记者 韩远飞)6月16日,中国科学院沈阳自动化研究所发布消息,该所工业控制网络与...
IPO 热潮来袭,MANGOS... IPO 市场强势回归,引领这波浪潮的却不再是昔日的老面孔。FAANG 时代已成过去,一个新的缩写词正...
实用攻略!2026 年让人着迷... 实用攻略!2026 年让人愿意天天戴的智能手表盘点:览邦 Watch Ultra——插卡 4G + ...
斯塔默:不排除邀请伯纳姆进入内... 据凤凰卫视报道,面对英国国内持续发酵的首相政权危机,正在法国参加七国集团峰会的英国首相斯塔默6月17...
战败者难逃一劫,秋后算账的檄文... 伊朗战争走向结束,秋后算账正在开始。《纽约时报》周二发社论,大标题就是“特朗普总统输掉了这场战争”。...
罗技G305 X Superl... IT之家 6 月 16 日消息,罗技现已推出 G305 X Superlight 鼠标。新品的模具与...
营新化工取得含氨热水脱氨塔专利... 国家知识产权局信息显示,营口营新化工科技有限公司取得一项名为“一种含氨热水脱氨塔”的专利,授权公告号...
原创 雷... 有些手机,第一眼看上去不是参数,而是一种气质。像夏天傍晚街边橱窗里的一束光,明明不张扬,却会让人忍不...
胡锡进:美军印太司令部改回原名... 美国宣布将印太司令部的名称重新改回太平洋司令部,该司令部是2018年被特朗普政府从太平洋司令部改称印...