Python中g(shù)etattr函數(shù)和hasattr函數(shù)作用詳解
hasattr(object, name)
作用:判斷對(duì)象object是否包含名為name的特性(hasattr是通過調(diào)用getattr(ojbect, name)是否拋出異常來實(shí)現(xiàn)的)。
示例:
>>> hasattr(list, 'append') True >>> hasattr(list, 'add') False getattr(object,name,default):
作用:返回object的名稱為name的屬性的屬性值,如果屬性name存在,則直接返回其屬性值;如果屬性name不存在,則觸發(fā)AttribetError異常或當(dāng)可選參數(shù)default定義時(shí)返回default值。
這個(gè)方法最主要的作用是實(shí)現(xiàn)反射機(jī)制。也就是說可以通過字符串獲取方法實(shí)例。這樣,你就可以把一個(gè)類可能要調(diào)用的方法放在配置文件里,在需要的時(shí)候動(dòng)態(tài)加載。
下面我們使用小例子來說明它們的用法:
import func_file #自定義python模塊 cs=input('請(qǐng)輸入要訪問的URL:') if cs=='loggin': func_file.loggin() if cs =='home': func_file.home() if cs =='': pass#以下省略
當(dāng)我定義一個(gè)自定義模塊,去調(diào)用其中的方法的時(shí)候,使用if去判斷時(shí),如果模塊內(nèi)用很多方法,會(huì)大大影響開發(fā)的效率,代碼冗余差,顯然這是不可取的。下面我們使用hasattr()函數(shù)來實(shí)現(xiàn)我們的需求:
示例如下:
import func_file #自定義python模塊,需事先存在 def run(): while True: cs=input('請(qǐng)輸入要訪問的URL:') #hasattr利用字符串的形式去對(duì)象(模塊)中操作(尋找)成員 if hasattr(func_file,cs): #判斷用戶輸入的URL是否在func_file模塊中 func=getattr(func_file,cs) #有則將func_file模塊下的cs函數(shù)賦值 func() #等同于執(zhí)行func_file模塊下的cs函數(shù) else: print('404')#定義錯(cuò)誤頁(yè)面 run()
我們導(dǎo)入一個(gè)自定義模塊后,gatattr可以根據(jù)輸入的內(nèi)容動(dòng)態(tài)加載,利用hasattr()函數(shù)來判斷用戶輸入的是否存在,不存在則調(diào)用自定義方法。
是不是感覺和我們打開網(wǎng)址URL很類似啊!
上一個(gè)示例有一個(gè)問題,在實(shí)際情況中,我們的功能函數(shù)可能存放在很多模塊中,每一個(gè)都需要單獨(dú)導(dǎo)入,那我們可不可以利用getattr()函數(shù)去動(dòng)態(tài)加載模塊呢?當(dāng)然可以啦
請(qǐng)看示例:
def run(): while True: cs=input('請(qǐng)輸入:') v,k=cs.split('/') #獲得輸入的模塊和模塊的方法 obj=__import__('lib.'+v,fromlist=True) #調(diào)用lib目錄下的模塊fromlist=True按路徑連接的方式導(dǎo)入 if hasattr(obj,k): f= getattr(obj,k) f() else: print('404') if __name__ == '__main__': run()
是不是感到getattr很強(qiáng)大啊。其實(shí),getattr()就是實(shí)現(xiàn)python反射的一塊積木,結(jié)合其它方法如setattr(),dir() 等,我們可以還可以做出很多有趣的事情。
相關(guān)文章
Python基于requests實(shí)現(xiàn)模擬上傳文件
這篇文章主要介紹了Python基于requests實(shí)現(xiàn)模擬上傳文件,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04python獲取網(wǎng)頁(yè)中所有圖片并篩選指定分辨率的方法
下面小編就為大家分享一篇python獲取網(wǎng)頁(yè)中所有圖片并篩選指定分辨率的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-03-03Pytorch從0實(shí)現(xiàn)Transformer的實(shí)踐
本文主要介紹了Pytorch從0實(shí)現(xiàn)Transformer的實(shí)踐,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05wxPython事件驅(qū)動(dòng)實(shí)例詳解
這篇文章主要介紹了wxPython事件驅(qū)動(dòng)機(jī)制,以一個(gè)獲取當(dāng)前位置信息的實(shí)例形式講述了wxPython事件驅(qū)動(dòng)機(jī)制及其相關(guān)函數(shù)的用法,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2014-09-09sklearn.metrics 中的f1-score簡(jiǎn)介
這篇文章主要介紹了sklearn.metrics 中的f1-score簡(jiǎn)介,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-05-05解決pytorch-yolov3 train 報(bào)錯(cuò)的問題
今天小編就為大家分享一篇解決pytorch-yolov3 train 報(bào)錯(cuò)的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-02-02對(duì)pandas中iloc,loc取數(shù)據(jù)差別及按條件取值的方法詳解
今天小編就為大家分享一篇對(duì)pandas中iloc,loc取數(shù)據(jù)差別及按條件取值的方法詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-11-11Python中單線程、多線程和多進(jìn)程的效率對(duì)比實(shí)驗(yàn)實(shí)例
這篇文章主要介紹了Python單線程多線程和多進(jìn)程效率對(duì)比,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05