python高階篇:反射機制大總結及__import__動態模組匯入問題完善

在上一篇《python高階篇:完善反射機制模擬web路由功能及動態匯入模組詳解》文章的末尾提到了動態匯入模組還是存在不完美的地方。既然我們追求完美,那就徹底的完美一次。本篇文章就實現一個最終的解決方案。

python高階篇:反射機制大總結及__import__動態模組匯入問題完善

一、問題引入

在上一篇文章中,user。py模組和order。py模組是在同一個目錄中,但是在真實的專案環境下,我們的模組與模組也是會組織到不同的包中,功能相近的模組會放到同一個包下(包:簡單理解就是資料夾,分門別類的作用)。如下圖所示:

python高階篇:反射機制大總結及__import__動態模組匯入問題完善

真實目錄結構

目錄結構的改變就導致在使用__import__函式匯入模組時路徑的改變,那麼該如何解決呢?思考十秒鐘……

二、問題解決

理所應當的會這麼做:__import__(“lib。” + modulestr),只需要加上一個“lib”字首就解決了問題,和普通的匯入模組的方式是一樣的,類似於import lib。user。如下圖所示:

python高階篇:反射機制大總結及__import__動態模組匯入問題完善

動態匯入模組

這樣似乎看起來沒有問題,但是實際上執行main。py,輸入“user/login”則會提示報錯:訪問的路徑不存在。什麼原因呢?原來呀

對於類似於"lib.a.b.c."這一類的模組匯入路徑,內建函式__import__預設只會匯入最開頭的圓點左邊的目錄。

也就是說只會匯入lib,根本不會連同“a,b,c”這些模組匯入,有興趣的朋友可以嘗試下。那麼這個問題又該怎麼解決呢?

三、解決方案一

只需要在__import__函式中新增一個引數,這個引數是fromlist = True即可。如下圖所示:

python高階篇:反射機制大總結及__import__動態模組匯入問題完善

動態匯入模組

四、解決方案二

使用工具模組importlib解決,如下圖所示:

python高階篇:反射機制大總結及__import__動態模組匯入問題完善

動態匯入模組

五、總結

至此,動態模組匯入的問題就完美解決了。透過這三篇文章的學習,我們利用反射機制模擬了web路由功能以及使用動態模組匯入功能對此程式進行了完善解決。

反射的本質是:利用字串的形式去物件/模組中操作屬性,是一種基於字串的事件驅動。

朋友們,明白了嗎