反射
為友好等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計制作服務(wù),及友好網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為網(wǎng)站建設(shè)、成都網(wǎng)站制作、友好網(wǎng)站設(shè)計,以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會得到認(rèn)可,從而選擇與我們長期合作。這樣,我們也可以走得更遠(yuǎn)!
在Python中,能夠通過一個對象,找出type、class、attribute或者method的能力,成為反射。
函數(shù)與方法
內(nèi)建函數(shù):
getattr(object,name[,degault]) 通過name返回object的屬性值,當(dāng)屬性不存在,將使用default返回,如果沒有default,則拋出AttributeError。Name必須為字符串。
setattr(object,name,value) object的屬性存在,則覆蓋,不存在,新增。
hasattr(object,name) 判斷對象是否有這個名字的屬性,name必須為字符串
反射相關(guān)的魔術(shù)方法
__getattr__()
一個類的屬性會按照繼承關(guān)系找,如果找不到,就會執(zhí)行__getattr__()方法,如果沒有這個方法,就會拋出AttributeError異常表示找不到屬性。
查找順序為:
Instance.__dict__-->instance.__class__.__dict__-->繼承的祖先類(直到object)的__dict__---找不到--> 調(diào)用__getattr__()
__setattr__()
可以攔截對實例屬性的增加、修改操作,如果要設(shè)置生效,需要自己操作實例的__dict__
__delattr__()
可以阻止通過實例刪除屬性的操作,但是通過類依然可以刪除屬性。
__getattribute__()
實例的所有的屬性訪問,第一個都會調(diào)用__getattribute__方法,它阻止了屬性的查找,該方法應(yīng)該返回值或者拋出一個AttributeError異常
它的return值將作為屬性查找的結(jié)果
如果拋出AttributeError異常,則會直接調(diào)用__gutattr__方法,因為表述屬性沒有找到。
__grtattribute__方法中為了避免在該方法中無限的遞歸,他的實現(xiàn)應(yīng)該永遠(yuǎn)調(diào)用基類的同名方法以訪問需要的任何屬性,例如:object.__getattribute__(self,name)。一般不使用該方法
魔術(shù)方法
__getattr__()
當(dāng)通過搜索實例、實例的類及祖先類查不到屬性,就會調(diào)用此方法
__setattr__()
通過.訪問實例的屬性,進行增加,修改都要調(diào)用它
__delattr__()
當(dāng)通過實例來刪除屬性時調(diào)用此方法
__getattribute__()
實例所有的屬性調(diào)用都從這個方法開始
屬性查找順序:
實例調(diào)用__getattribute__() --> Instance.__dict__-->instance.__class__.__dict__-->繼承的祖先類(直到object)的__dict__---找不到--> 調(diào)用__getattr__() 。
描述器:
描述器定義
在python中,一個類實現(xiàn)了__get__、__set__、__delete__三個方法中的任何一個方法,就是描述器。
如果僅實現(xiàn)了__get__,就是非數(shù)據(jù)描述符non-data descriptor
同時實現(xiàn)了__get__,__set__就是數(shù)據(jù)描述符 data descriptor
如果一個類的類屬性設(shè)置為描述器實例,那么它被稱為owner屬主
屬性查找順序
實例的__dict__優(yōu)先于非數(shù)據(jù)描述器,數(shù)據(jù)描述器優(yōu)先于實例的__dict__
有__delete__方法有同樣的效果,有了這個方法,也是數(shù)據(jù)描述器。
描述器在python中應(yīng)用非常廣泛,python的方法(包括staticmethod()和class method())都實現(xiàn)為非數(shù)據(jù)描述器,因此,實現(xiàn)可以重新定義和覆蓋方法。這允許單個實例獲取與同一個類的其他實例不同的行為。
Python中property()函數(shù)實現(xiàn)為一個數(shù)據(jù)描述器。
新聞名稱:Python中反射和描述器總結(jié)
網(wǎng)頁路徑:http://muchs.cn/article34/pppjpe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供自適應(yīng)網(wǎng)站、外貿(mào)建站、網(wǎng)站營銷、網(wǎng)站改版、、App開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)