python通過(guò)實(shí)例講解反射機(jī)制
一、反射機(jī)制簡(jiǎn)介:
- 通過(guò)字符串的形式導(dǎo)入模塊
- 通過(guò)字符串的形式,去模塊中尋找指定的函數(shù),并執(zhí)行
- 規(guī)定用戶輸入格式 模塊名/函數(shù)名 通過(guò)__import__的形式導(dǎo)入模塊,并通過(guò) hasattr和getattr 檢查并獲取函數(shù)返回值。
相關(guān)方法:
- getattr:--根據(jù)字符串的形式去某個(gè)模塊中尋找東西
- hasattr:--根據(jù)字符串的形式去某個(gè)模塊中判斷東西是否存在
- setattr:--根據(jù)字符串的形式去某個(gè)模塊中設(shè)置東西
- delattr:--根據(jù)字符串的形式去某個(gè)模塊中刪除東西
二、反射機(jī)制初識(shí):
test.py
#!/usr/bin/env python # -*- coding:utf-8 -*- def f1(): return '我是F1,我被調(diào)用了' def f2(): return '我是F2,我被調(diào)用了' def f3(): return '我是F3,我被調(diào)用了'
index.py
#!/usr/bin/env python # -*- coding:utf-8 -*- """ 反射機(jī)制 1.根據(jù)字符串的形式導(dǎo)入模塊。 2.根據(jù)字符串的形式去對(duì)象(某個(gè)模塊)中操作其成員 實(shí)現(xiàn)思路:規(guī)定用戶輸入格式 模塊名/函數(shù)名 通過(guò)__import__的形式導(dǎo)入模塊,并通過(guò) hasattr和getattr 檢查并獲取函數(shù)返回值。 """ #通過(guò)用戶輸入的形式, 導(dǎo)入模塊 inp = input('請(qǐng)輸入需要導(dǎo)入的模塊名:') #__import__用于以字符串的形式導(dǎo)入模塊 dd = __import__(inp) #在模塊尋找函數(shù)并執(zhí)行函數(shù) inp_func = input('請(qǐng)輸入需要執(zhí)行的函數(shù):') #getattr()用于以字符串的形式去某個(gè)模塊中尋找函數(shù) tager_func = getattr(dd, inp_func) #在獲取到的函數(shù)名后加()表示執(zhí)行函數(shù) result = tager_func() print(result)
代碼執(zhí)行結(jié)果:
請(qǐng)輸入需要導(dǎo)入的模塊名:test 請(qǐng)輸入需要執(zhí)行的函數(shù):f2 我是F2,我被調(diào)用了
實(shí)例:基于反射模擬Web框架路由系統(tǒng)(一)
commons.py
#!/usr/bin/env python # -*- coding:utf-8 -*- def login(): return 'login' def logout(): return 'logout' def nb(): return '很牛逼的網(wǎng)頁(yè)'
refec_demo.py
#!/usr/bin/env python # -*- coding:utf-8 -*- """ 基于反射模擬web框架路由系統(tǒng) """ from lib import commons url = input('請(qǐng)輸入模擬的url路徑:') if url.endswith('login'): ret = commons.login() print(ret) elif url.endswith('logout'): ret = commons.logout() print(ret) else: print('404')
實(shí)例:基于反射模擬Web框架路由系統(tǒng)(二)
refec_demo1.py
#!/usr/bin/env python # -*- coding:utf-8 -*- from lib import commons inp = input('請(qǐng)輸入模擬的url路徑:') url_inp = inp.split('/')[-1] if hasattr(commons, url_inp): ret = getattr(commons, url_inp) result = ret() print(result) else: print('404')
代碼實(shí)現(xiàn)結(jié)果:
路徑正確時(shí)結(jié)果:
路徑不正確時(shí)結(jié)果:
實(shí)例:基于反射模擬Web框架路由系統(tǒng)(三)
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 -*- #用戶輸入規(guī)則:模塊名/函數(shù)名 url = input('請(qǐng)輸入模塊名/函數(shù)名:') target_modul, target_func = url.split('/') #__import__導(dǎo)入模塊 mod = __import__('lib.' + target_modul, fromlist=True) #hasattr()判斷函數(shù)是否存在 if hasattr(mod, target_func): ret = getattr(mod, target_func) result = ret() print(result) else: print('404')
當(dāng)模塊和函數(shù)都存在時(shí),url路徑調(diào)用結(jié)果:
當(dāng)模塊和函數(shù)都不存在時(shí),url路徑調(diào)用結(jié)果:
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Python實(shí)現(xiàn)讀取TXT文件數(shù)據(jù)并存進(jìn)內(nèi)置數(shù)據(jù)庫(kù)SQLite3的方法
這篇文章主要介紹了Python實(shí)現(xiàn)讀取TXT文件數(shù)據(jù)并存進(jìn)內(nèi)置數(shù)據(jù)庫(kù)SQLite3的方法,涉及Python針對(duì)txt文件的讀取及sqlite3數(shù)據(jù)庫(kù)的創(chuàng)建、插入、查詢等相關(guān)操作技巧,需要的朋友可以參考下2017-08-08PyQt QListWidget修改列表項(xiàng)item的行高方法
今天小編就為大家分享一篇PyQt QListWidget修改列表項(xiàng)item的行高方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-06-06Pycharm使用時(shí)會(huì)出現(xiàn)的問(wèn)題之cv2無(wú)法安裝解決
這篇文章主要介紹了Pycharm使用時(shí)會(huì)出現(xiàn)的問(wèn)題之cv2無(wú)法安裝解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-05-05Python編程之gui程序?qū)崿F(xiàn)簡(jiǎn)單文件瀏覽器代碼
這篇文章主要介紹了Python編程之gui程序?qū)崿F(xiàn)簡(jiǎn)單文件瀏覽器代碼,具有一定借鑒價(jià)值,需要的朋友可以了解下。2017-12-12python調(diào)用pymssql包操作SqlServer數(shù)據(jù)庫(kù)的實(shí)現(xiàn)
本文主要介紹了python調(diào)用pymssql包操作SqlServer數(shù)據(jù)庫(kù)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06Django實(shí)現(xiàn)將views.py中的數(shù)據(jù)傳遞到前端html頁(yè)面,并展示
這篇文章主要介紹了Django實(shí)現(xiàn)將views.py中的數(shù)據(jù)傳遞到前端html頁(yè)面并展示,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-03-03Python使用concurrent.futures模塊實(shí)現(xiàn)多進(jìn)程多線程編程
Python的concurrent.futures模塊可以很方便的實(shí)現(xiàn)多進(jìn)程、多線程運(yùn)行,減少了多進(jìn)程帶來(lái)的的同步和共享數(shù)據(jù)問(wèn)題,下面就跟隨小編一起了解一下concurrent.futures模塊的具體使用吧2023-12-12