1、反射機制簡介:python
經過字符串的形式導入模塊web
經過字符串的形式,去模塊中尋找指定的函數,並執行框架
規定用戶輸入格式 模塊名/函數名 經過__import__的形式導入模塊,並經過 hasattr和getattr 檢查並獲取函數返回值。
相關方法:
getattr:--根據字符串的形式去某個模塊中尋找東西
hasattr:--根據字符串的形式去某個模塊中判斷東西是否存在
setattr:--根據字符串的形式去某個模塊中設置東西
delattr:--根據字符串的形式去某個模塊中刪除東西函數
2、反射機制初識:
test.py url
#!/usr/bin/env python # -*- coding:utf-8 -*- def f1(): return '我是F1,我被調用了' def f2(): return '我是F2,我被調用了' def f3(): return '我是F3,我被調用了'
index.pyspa
#!/usr/bin/env python # -*- coding:utf-8 -*- """ 反射機制 1.根據字符串的形式導入模塊。 2.根據字符串的形式去對象(某個模塊)中操做其成員 實現思路:規定用戶輸入格式 模塊名/函數名 經過__import__的形式導入模塊,並經過 hasattr和getattr 檢查並獲取函數返回值。 """ #經過用戶輸入的形式, 導入模塊 inp = input('請輸入須要導入的模塊名:') #__import__用於以字符串的形式導入模塊 dd = __import__(inp) #在模塊尋找函數並執行函數 inp_func = input('請輸入須要執行的函數:') #getattr()用於以字符串的形式去某個模塊中尋找函數 tager_func = getattr(dd, inp_func) #在獲取到的函數名後加()表示執行函數 result = tager_func() print(result)
代碼執行結果:code
請輸入須要導入的模塊名:test 請輸入須要執行的函數:f2 我是F2,我被調用了
實例:基於反射模擬Web框架路由系統(一)對象
commons.pyblog
#!/usr/bin/env python # -*- coding:utf-8 -*- def login(): return 'login' def logout(): return 'logout' def nb(): return '很牛逼的網頁'
refec_demo.py utf-8
#!/usr/bin/env python # -*- coding:utf-8 -*- """ 基於反射模擬web框架路由系統 """ from lib import commons url = input('請輸入模擬的url路徑:') if url.endswith('login'): ret = commons.login() print(ret) elif url.endswith('logout'): ret = commons.logout() print(ret) else: print('404')
實例:基於反射模擬Web框架路由系統(二)
refec_demo1.py
#!/usr/bin/env python # -*- coding:utf-8 -*- from lib import commons inp = input('請輸入模擬的url路徑:') url_inp = inp.split('/')[-1] if hasattr(commons, url_inp): ret = getattr(commons, url_inp) result = ret() print(result) else: print('404')
代碼實現結果:
路徑正確時結果:
路徑不正確時結果:
實例:基於反射模擬Web框架路由系統(三)
manager.py
#!/usr/bin/env python # -*- coding:utf-8 -*- def home(): return 'Home'
order.py
#!/usr/bin/env python # -*- coding:utf-8 -*- def add_order(): return '添加訂單'
refec_demo2.py
#!/usr/bin/env python # -*- coding:utf-8 -*- #用戶輸入規則:模塊名/函數名 url = input('請輸入模塊名/函數名:') target_modul, target_func = url.split('/') #__import__導入模塊 mod = __import__('lib.' + target_modul, fromlist=True) #hasattr()判斷函數是否存在 if hasattr(mod, target_func): ret = getattr(mod, target_func) result = ret() print(result) else: print('404')
當模塊和函數都存在時,url路徑調用結果:
當模塊和函數都不存在時,url路徑調用結果: