內置函數補充 之 反射
阿新 • • 發佈:2018-06-16
... .py 圖片 TP HA 技術分享 web pla 分布
getattr 反射
為什麽要有反射?
當在設計一個頁面訪問的時候,通過用戶輸入相應的url,進入相應的頁面,在用戶輸入的url地址不存在的時候,返回404錯誤。
def run(): inp = input(‘請輸入要訪問的url:‘) if inp == ‘login‘: commons.login() elif inp == ‘logout‘: commons.logout() elif inp == ‘home‘: commons.home() else: print(‘404‘) run()
def login(): print(‘炫酷登錄頁面‘) def logout(): print(‘炫酷退出頁面‘) def home(): print(‘炫酷主頁面‘)commons.py
但通過以上的形式進行編寫,如果一旦需要增添更多的頁面的時候,代碼寫入的工作量就變得巨大
getattr / hasattr
通過反射即可實現更高效的代碼,也是基於反射實現類Web框架的路由系統,
getattr(commons,inp) 的含義就是讓getattr自己去commons模塊中尋找inp輸入中對應的函數,即是login就對應login,是logout就應對logout。
import commons def run(): inp = input(‘請輸入要訪問的url:‘) #利用字符串的形式去對象(模塊)中操作(尋找/檢查)成員 if hasattr(commons,inp): #檢查是否有相應的成員,如果有進行操作 func = getattr(commons,inp) #操作成員 func() else: print(‘404‘) run()
def login(): print(‘炫酷登錄頁面‘) def logout(): printcommons.py(‘炫酷退出頁面‘) def home(): print(‘炫酷主頁面‘)
反射的4個內置函數分別為:
getattr、hasattr、setattr、delattr ,其作用為獲取成員、檢查成員、設置成員、刪除成員。
__import__()
如果不同的def函數沒有集中在同一個.py文件的模塊中,而是根據所能提供的不同功能,散列的分布在眾多的.py文件中的時候。
我們不可能去一個一個的import xxx對眾多的模塊進行一一導入,這個時候我們也可以對import的導入模塊的操作進行反射
即以"字符串"的形式導入模塊。
def run(): inp = input(‘請輸入要訪問的url:‘) m,f = inp.split(‘/‘) obj = __import__(m) if hasattr(obj,f): #檢查是否有相應的成員,如果有進行操作 func = getattr(obj,f) #操作成員 func() else: print(‘404‘) run()
各__import__()和各.py文件之間的關系圖
建設中....
內置函數補充 之 反射