python通過例項講解反射機制
阿新 • • 發佈:2020-01-09
一、反射機制簡介:
- 通過字串的形式匯入模組
- 通過字串的形式,去模組中尋找指定的函式,並執行
- 規定使用者輸入格式 模組名/函式名 通過__import__的形式匯入模組,並通過 hasattr和getattr 檢查並獲取函式返回值。
相關方法:
- getattr:--根據字串的形式去某個模組中尋找東西
- hasattr:--根據字串的形式去某個模組中判斷東西是否存在
- setattr:--根據字串的形式去某個模組中設定東西
- delattr:--根據字串的形式去某個模組中刪除東西
二、反射機制初識:
test.py
#!/usr/bin/env python # -*- coding:utf-8 -*- def f1(): return '我是F1,我被呼叫了' def f2(): return '我是F2,我被呼叫了' def f3(): return '我是F3,我被呼叫了'
index.py
#!/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)
程式碼執行結果:
請輸入需要匯入的模組名:test 請輸入需要執行的函式:f2 我是F2,我被呼叫了
例項:基於反射模擬Web框架路由系統(一)
commons.py
#!/usr/bin/env python # -*- coding:utf-8 -*- def login(): return 'login' def logout(): return 'logout' def nb(): return '很牛逼的網頁'
refec_demo.py
#!/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路徑呼叫結果:
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。