小結Python的反射機制
前言:
前兩天用Python實現(xiàn)了ftp服務器。在小項目中就用到了反射。因此寫個筆記鞏固下。
反射的定義:檢測和修改它本身狀態(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對象里的對應的方法的內(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)# 此時打印的是:laowangf = getattr(p,'talk') # 獲取talk方法的內(nèi)存地址f() # 調(diào)用talk方法我們發(fā)現(xiàn)getattr有三個參數(shù),那么第三個參數(shù)是做什么用的呢?s = getattr(p,'abc','not find')print(s)# 打印結果:not find。因為abc在對象p中找不到,本應該報錯,但因為修改了找不到就輸出not find
setattr:通過setattr將外部的一個函數(shù)綁定到實例中
def abc(self): print('%s正在交談'%self.name)class Person(object): def __init__(self,name): self.name = namep = Person('laowang')setattr(p,'talk',abc) # 將abc函數(shù)添加到對象中p中,并命名為talkp.talk(p)# 調(diào)用talk方法,因為這是額外添加的方法,需手動傳入對象setattr(p,'age',30) # 添加一個變量age,復制為30print(p.age) # 打印結果: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)導入模塊(基于反射當前模塊成員)
以上就是小結Python的反射機制的詳細內(nèi)容,更多關于python 反射的資料請關注好吧啦網(wǎng)其它相關文章!
相關文章:
1. python mysql 字段與關鍵字沖突的解決方式2. ASP中if語句、select 、while循環(huán)的使用方法3. bootstrap select2 動態(tài)從后臺Ajax動態(tài)獲取數(shù)據(jù)的代碼4. XML入門精解之結構與語法5. python編寫五子棋游戲6. SpringMVC+Jquery實現(xiàn)Ajax功能7. python讀取中文路徑時出錯(2種解決方案)8. Python用K-means聚類算法進行客戶分群的實現(xiàn)9. layui Ajax請求給下拉框賦值的實例10. Python加載數(shù)據(jù)的5種不同方式(收藏)
