小結(jié)Python的反射機(jī)制
前言:
前兩天用Python實(shí)現(xiàn)了ftp服務(wù)器。在小項(xiàng)目中就用到了反射。因此寫個(gè)筆記鞏固下。
反射的定義:檢測(cè)和修改它本身狀態(tài)或行為的一種能力(自?。?。
而通過(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實(shí)現(xiàn)的web監(jiān)控系統(tǒng)
這篇文章主要介紹了python實(shí)現(xiàn)的web監(jiān)控系統(tǒng),幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下2021-04-04
python輕量級(jí)orm框架 peewee常用功能速查詳情
Peewee是一種簡(jiǎn)單而小的ORM。它有很少的(但富有表現(xiàn)力的)概念,使它易于學(xué)習(xí)和直觀的使用,感興趣的朋友可以參考下面文章的具體內(nèi)容2021-09-09
Pandas數(shù)據(jù)連接pd.concat的實(shí)現(xiàn)
本文主要介紹了Pandas數(shù)據(jù)連接pd.concat的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07
Python中使用matplotlib模塊errorbar函數(shù)繪制誤差棒圖實(shí)例代碼
在matplotlib中,errorbar方法用于繪制帶誤差線的折線圖,下面這篇文章主要給大家介紹了關(guān)于Python中使用matplotlib模塊errorbar函數(shù)繪制誤差棒圖的相關(guān)資料,需要的朋友可以參考下2022-08-08
解決遇到:PytorchStreamReader failed reading zip&n
本文針對(duì)"PytorchStreamReaderfailedreadingziparchive:failedfindingcentral"錯(cuò)誤提出解決方案,包括檢查文件完整性、文件路徑,嘗試更新PyTorch版本,檢查壓縮文件格式,代碼問(wèn)題,或?qū)で蠹夹g(shù)支持等,希望這些經(jīng)驗(yàn)?zāi)芙o遇到同樣問(wèn)題的人一個(gè)參考2024-09-09
python深度學(xué)習(xí)借助多標(biāo)簽分類器進(jìn)行對(duì)抗訓(xùn)練
這篇文章主要為大家介紹了python深度學(xué)習(xí)中如何借助多標(biāo)簽分類器進(jìn)行對(duì)抗訓(xùn)練,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-01-01
Python 使用 Pillow 模塊給圖片添加文字水印的方法
這篇文章主要介紹了Python 使用 Pillow 模塊給圖片添加文字水印的方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-08-08

