小結(jié)Python的反射機(jī)制
前言:
前兩天用Python實(shí)現(xiàn)了ftp服務(wù)器。在小項(xiàng)目中就用到了反射。因此寫個(gè)筆記鞏固下。
反射的定義:檢測(cè)和修改它本身狀態(tài)或行為的一種能力(自省)。
而通過反射,Python可以通過字符串的映射或修改程序運(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í)打印的是:laowangf = 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:通過setattr將外部的一個(gè)函數(shù)綁定到實(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ù)添加到對(duì)象中p中,并命名為talkp.talk(p)# 調(diào)用talk方法,因?yàn)檫@是額外添加的方法,需手動(dòng)傳入對(duì)象setattr(p,'age',30) # 添加一個(gè)變量age,復(fù)制為30print(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)注好吧啦網(wǎng)其它相關(guān)文章!
相關(guān)文章:
1. python爬蟲實(shí)戰(zhàn)之制作屬于自己的一個(gè)IP代理模塊2. 如何在jsp界面中插入圖片3. 詳解盒子端CSS動(dòng)畫性能提升4. HTML 絕對(duì)路徑與相對(duì)路徑概念詳細(xì)5. css代碼優(yōu)化的12個(gè)技巧6. .NET6打包部署到Windows Service的全過程7. Ajax返回值類型與用法實(shí)例分析8. Vue element ui用戶展示頁(yè)面的實(shí)例9. asp批量添加修改刪除操作示例代碼10. 使用FormData進(jìn)行Ajax請(qǐng)求上傳文件的實(shí)例代碼
