小結(jié)Python的反射機制
前言:
前兩天用Python實現(xiàn)了ftp服務(wù)器。在小項目中就用到了反射。因此寫個筆記鞏固下。
反射的定義:檢測和修改它本身狀態(tài)或行為的一種能力(自省)。
而通過反射,Python可以通過字符串的映射或修改程序運行的狀態(tài)和方法。
反射的四個方法。hasattr,getattr,setattr,delattr
hasattr:判斷一個方法是否存在與這個類中
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。因為存在talk方法 print(hasattr(p,"name")) # True。因為存在name變量 print(hasattr(p,"abc")) # False。因為不存在abc方法或變量
getattr:根據(jù)字符串去獲取obj對象里的對應(yīng)的方法的內(nèi)存地址,加"()"括號即可執(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) # 此時打印的是:laowang f = getattr(p,"talk") # 獲取talk方法的內(nèi)存地址 f() # 調(diào)用talk方法 我們發(fā)現(xiàn)getattr有三個參數(shù),那么第三個參數(shù)是做什么用的呢? s = getattr(p,"abc","not find") print(s) # 打印結(jié)果:not find。因為abc在對象p中找不到,本應(yīng)該報錯,但因為修改了找不到就輸出not find
setattr:通過setattr將外部的一個函數(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ù)添加到對象中p中,并命名為talk p.talk(p) # 調(diào)用talk方法,因為這是額外添加的方法,需手動傳入對象 setattr(p,"age",30) # 添加一個變量age,復制為30 print(p.age) # 打印結(jié)果:30
delattr:刪除一個實例或者類中的方法
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) # 此時將報錯
為什么用反射
好處一:
實現(xiàn)可插拔機制
可以事先定義好接口,接口只有在被完成后才會真正執(zhí)行,這實現(xiàn)了即插即用,這其實是一種‘后期綁定'
好處二:
動態(tài)導入模塊(基于反射當前模塊成員)
以上就是小結(jié)Python的反射機制的詳細內(nèi)容,更多關(guān)于python 反射的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
用python統(tǒng)計代碼行的示例(包括空行和注釋)
今天小編就為大家分享一篇用python統(tǒng)計代碼行的示例(包括空行和注釋),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-07-07python 使用tkinter與messagebox寫界面和彈窗
這篇文章主要介紹了python 使用tkinter與messagebox寫界面和彈窗,文章內(nèi)容詳細,具有一的的參考價值,需要的小伙伴可以參考一下2022-03-03pygame.display.flip()和pygame.display.update()的區(qū)別及說明
這篇文章主要介紹了pygame.display.flip()和pygame.display.update()的區(qū)別及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-03-03