内置函数补充 之 反射
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                内置函数补充 之 反射
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
                                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 commonsdef run():inp = input('請輸入要訪問的url:')#利用字符串的形式去對象(模塊)中操作(尋找/檢查)成員if hasattr(commons,inp): #檢查是否有相應的成員,如果有進行操作func = getattr(commons,inp) #操作成員 func()else:print('404')run() def login():print('炫酷登錄頁面')def logout():print('炫酷退出頁面')def home():print('炫酷主頁面') commons.py反射的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文件之間的關系圖
?
?
如果其中一個.py文件在另一個文件下目錄之下就要通過fromlist = True來找到該.py文件
def run():inp = input('請輸入要訪問的url:')m,f = inp.split('/')obj = __import__("lib." + m, fromlist = True) #該模塊在lib文件下路徑之下的時候if hasattr(obj,f): #檢查是否有相應的成員,如果有進行操作func = getattr(obj,f) #操作成員 func()else:print('404')run()?
總結:
反射的實例:偽造Web框架的路由系統
反射:基于字符串的形式去對象(模塊)中操作其成員。getattr、hasattr、setattr、delattr?。
擴展:導入模塊
import xxx from xxx import oooobj = __import__("xxx") obj = __import__("xxx.oo.xxx", fromlist=True)?
轉載于:https://www.cnblogs.com/evenyao/p/9190868.html
總結
以上是生活随笔為你收集整理的内置函数补充 之 反射的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: JDK源码分析(三)——HashMap
- 下一篇: 唠叨走势类型
