小結(jié)Python的反射機(jī)制
前言:
前兩天用Python實(shí)現(xiàn)了ftp服務(wù)器。在小項(xiàng)目中就用到了反射。因此寫個(gè)筆記鞏固下。
反射的定義:檢測(cè)和修改它本身狀態(tài)或行為的一種能力(自?。?/p>
而通過(guò)反射,Python可以通過(guò)字符串的映射或修改程序運(yùn)行的狀態(tài)和方法。
反射的四個(gè)方法。hasattr,getattr,setattr,delattr
hasattr:判斷一個(gè)方法是否存在與這個(gè)類中
class Person(object): def __init__(self,name): self.name = name def talk(self): print("%s正在交談"%self.name) p = Person("laowang") print(hasattr(p,"talk")) # True。因?yàn)榇嬖趖alk方法 print(hasattr(p,"name")) # True。因?yàn)榇嬖趎ame變量 print(hasattr(p,"abc")) # False。因?yàn)椴淮嬖赼bc方法或變量
getattr:根據(jù)字符串去獲取obj對(duì)象里的對(duì)應(yīng)的方法的內(nèi)存地址,加"()"括號(hào)即可執(zhí)行
class Person(object): def __init__(self,name): self.name = name def talk(self): print("%s正在交談"%self.name) p = Person("laowang") n = getattr(p,"name") # 獲取name變量的內(nèi)存地址 print(n) # 此時(shí)打印的是:laowang f = getattr(p,"talk") # 獲取talk方法的內(nèi)存地址 f() # 調(diào)用talk方法 我們發(fā)現(xiàn)getattr有三個(gè)參數(shù),那么第三個(gè)參數(shù)是做什么用的呢? s = getattr(p,"abc","not find") print(s) # 打印結(jié)果:not find。因?yàn)閍bc在對(duì)象p中找不到,本應(yīng)該報(bào)錯(cuò),但因?yàn)樾薷牧苏也坏骄洼敵鰊ot find
setattr:通過(guò)setattr將外部的一個(gè)函數(shù)綁定到實(shí)例中
def abc(self): print("%s正在交談"%self.name) class Person(object): def __init__(self,name): self.name = name p = Person("laowang") setattr(p,"talk",abc) # 將abc函數(shù)添加到對(duì)象中p中,并命名為talk p.talk(p) # 調(diào)用talk方法,因?yàn)檫@是額外添加的方法,需手動(dòng)傳入對(duì)象 setattr(p,"age",30) # 添加一個(gè)變量age,復(fù)制為30 print(p.age) # 打印結(jié)果:30
delattr:刪除一個(gè)實(shí)例或者類中的方法
class Person(object): def __init__(self,name): self.name = name def talk(self): print("%s正在交談"%self.name) p = Person("laowang") delattr(p,"name") # 刪除name變量 print(p.name) # 此時(shí)將報(bào)錯(cuò)
為什么用反射
好處一:
實(shí)現(xiàn)可插拔機(jī)制
可以事先定義好接口,接口只有在被完成后才會(huì)真正執(zhí)行,這實(shí)現(xiàn)了即插即用,這其實(shí)是一種‘后期綁定'
好處二:
動(dòng)態(tài)導(dǎo)入模塊(基于反射當(dāng)前模塊成員)
以上就是小結(jié)Python的反射機(jī)制的詳細(xì)內(nèi)容,更多關(guān)于python 反射的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
用python統(tǒng)計(jì)代碼行的示例(包括空行和注釋)
今天小編就為大家分享一篇用python統(tǒng)計(jì)代碼行的示例(包括空行和注釋),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-07-07使用Python實(shí)現(xiàn)多功能課堂點(diǎn)名器與抽簽工具
這篇文章主要為大家詳細(xì)介紹了如何使用Python實(shí)現(xiàn)多功能課堂點(diǎn)名器,也可以用作抽簽工具,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-02-02Python sort 自定義函數(shù)排序問(wèn)題
這篇文章主要介紹了Python sort 自定義函數(shù)排序問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09python 使用tkinter與messagebox寫界面和彈窗
這篇文章主要介紹了python 使用tkinter與messagebox寫界面和彈窗,文章內(nèi)容詳細(xì),具有一的的參考價(jià)值,需要的小伙伴可以參考一下2022-03-03通過(guò)python 執(zhí)行 nohup 不生效的解決
這篇文章主要介紹了通過(guò)python 執(zhí)行 nohup 不生效的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-04-04pygame.display.flip()和pygame.display.update()的區(qū)別及說(shuō)明
這篇文章主要介紹了pygame.display.flip()和pygame.display.update()的區(qū)別及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-03-03matplotlib圖形整合之多個(gè)子圖繪制的實(shí)例代碼
matplotlib繪制多個(gè)子圖的時(shí)候,我們可以根據(jù)自己的想法去排列子圖的順序,也可以生成不同的子圖數(shù)量,本文就詳細(xì)的介紹了matplotlib 多子圖繪制,具有一定的參考價(jià)值,感興趣的可以了解一下2022-04-04