国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python中反射和描述器總結

2020-02-15 23:02:29
字體:
來源:轉載
供稿:網友

反射

在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__方法有同樣的效果,有了這個方法,也是數據描述器。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 洱源县| 裕民县| 咸丰县| 措美县| 商南县| 怀远县| 郎溪县| 宝兴县| 永吉县| 大宁县| 勐海县| 泰来县| 乡城县| 镇康县| 永寿县| 双峰县| 浏阳市| 河源市| 株洲县| 遵化市| 巴楚县| 翁源县| 新竹市| 胶南市| 吕梁市| 民权县| 长治县| 宿州市| 隆安县| 潜山县| 光泽县| 湘潭市| 政和县| 崇礼县| 酉阳| 商河县| 湘阴县| 新竹市| 科尔| 彭阳县| 洛隆县|