動態匯入
執行時,根據使用者需求(提供字串),找到模組的資源動態載入起來。
1內建函式__import__()
__import__(name,globals = none,locals = none,fromlist = (),level = 0)
name,模組名
import語句本質上就是呼叫這個函式,但是不鼓勵直接使用它,建議使用importlib.import_module()。
sys = __import__("sys")等價於import sys
#test1.py
classa:defshowme(self):print("i am a")#test2.py
if __name__ =="__main__":
mod= __import__("test1")
cls= getattr(mod,"a")
cls().showme()
結果為:
i am a
也可以定義乙個函式,動態的載入。
上面的showme不要,不然呼叫了。
importlib.import_module()
importlib.import_module(name,package = none)
支援絕對匯入和相對匯入,如果是相對匯入,package必須設定。
#test1.py
classa:defshowme(self):print("i am a")#test2.py
importimportlibdef plugin_load(pluign_name:str,sep=":"):
m,_,c=pluign_name.partition(sep)
mod=importlib.import_module(m)
cls=getattr(mod,c)returncls()if __name__ =="__main__":#安裝外掛程式
a = plugin_load("test1:a")
a.showme()
結果為:
i am a
上面的例子就是外掛程式化程式設計的核心**
外掛程式化程式設計技術
依賴的技術
反射:執行時獲取型別的資訊,可以動態維護型別新資料。
動態import:推薦使用importlib模組,實現動態import模組的能力。
多執行緒:可以開啟乙個執行緒,等待使用者輸入,從而載入指定名稱的模組。
載入的時機
什麼時候載入合適?
程式啟動的時候,這是程式執行中?
程式啟動時,像pycharm這樣的工具,需要很多元件,這些元件也可能是外掛程式,啟動的時候掃瞄固定的目錄,載入外掛程式。
程式執行中,程式執行過程中,接受使用者指令或請求,啟動相應的外掛程式。
兩種方式各有利弊,如果外掛程式過多,對導致程式啟動很慢,如果使用者需要時再載入,如果外掛程式太大或者依賴多,外掛程式也會啟動慢。
所以先載入必須的,常用的外掛程式,其他外掛程式使用時,發現需要,動態載入。
應用軟體的設計不可能盡善盡美,或者在某些功能上,不可能做的專業,需要專業的客戶自己增強,比如photoshop的濾鏡外掛程式。
notepad++,它只需要做好乙個文字編輯器就可以了,其他增強功能都通過外掛程式的方式提供。拼寫檢查,html預覽、正則外掛程式等。
要定義規範,定義外掛程式從**來,如何載入,必須實現的功能等。
介面和外掛程式的區別?
介面往往是暴露出來的功能,例如模組提供的函式或方法,載入模組後呼叫這些函式完成功能。介面也是一種規範,它約定了必須實現的功能(必須提供某名稱的函式),但是不關心怎麼實現這個功能。
外掛程式是吧模組載入到系統中,執行它,增強當前系統功能,或者提供系統不具備的功能,往往外掛程式技術應用在框架設計中,系統本身設計簡單化,輕量級,實現基本功能後,其他功能通過外掛程式加入進來,方便擴充套件。
執行python程式
1 在windows下執行python程式 1 從dos命令列執行python指令碼 用python直譯器來執行python指令碼,在windows下面python直譯器是python.exe,我的python檔案安裝在d python27,在這個目錄下可以看到python直譯器。完整的命令應該是 ...
執行python程式
1 在windows下執行python程式 1 從dos命令列執行python指令碼 用python直譯器來執行python指令碼,在windows下面python直譯器是python.exe,我的python檔案安裝在d python27,在這個目錄下可以看到python直譯器。完整的命令應該是 ...
python源程式執行 Python程式執行機制
對於pyhton語言的執行過程,筆者整理了以下流程圖 關於以上流程圖的說明 1.執行a.py檔案時,首先會檢查a.py檔案內是否匯入了其他檔案 如import b 2.若沒有匯入其他檔案,則會將原始碼a.py編譯成中間結果的位元組碼 即pycodeobject,它是放在記憶體中的,並沒有做持久化操作...