1、動態導入:
運行時,根據用戶需求(提供字符串),找到模塊的資源動態加載起來。
2、內建函數__import__()
def __import__(name, globals=None, locals=None, fromlist=(), level=0):
name:模塊名
import語句本質上就是調用這個函數,但是不鼓勵直接使用它,建議使用importlib.import_module()。
sys = __import__('sys')等價於import sys
測試 直接調用:
測試 可以動態交互加載模塊:
1 if __name__ == '__main__': 2 name = input('>>>') 3 mod = __import__(name) # import tt 4 cls = getattr(mod, 'A') 5 cls().showme()
2、importlib.import_module()
1 import importlib 2 importlib.import_module(name, package=None)
支持絕對導入 和 相對導入,如果是相對導入,package必須設置。
測試:插件化編程的核心代碼。
相對導入:
3、插件化編程技術:
依賴的技術:
反射:運行時獲取類型的信息,可以動態維護類型數據。
動態import:推薦使用importlib 模塊,實現動態import模塊的能力。
多線程:可以開啟一個線程,等待用戶輸入,從而加載指定名稱的模塊。
加載的時機:
1、程序啟動時:
像pycharm 這樣的工具,需要很多組建,這些組件也可能是插件,啟動的時候,掃描固定的目錄,加載插件
2、程序運行中:
程序運行過程中,接受用戶指令或請求,啟動相應的插件。
兩種當時各有利弊,如果插件過多,或導致程序啟動很慢,如果用戶需要時加載,如果產檢太大或者依賴多,插件也會啟動慢
所以先加載必須的,常用的插件,其他插件使用時,在動態載入。
4、應用:
軟件的設計不可能完美,或者在某些功能上,不可能做的專業,需要專業的客戶增強。如PS
5、接口和插件的區別:
接口往往是暴露出來的功能,例如模塊提供的函數或方法,加載模塊后嗲用這些函數完成功能,
接口也是一種規范,它約定了必須是此案的功能(必須提供某名稱的函數), 但是不關心怎么實現這個功能。
插件是把模塊加載到系統中,運行它,增強當前系統功能,或者提供系統不具備的功能,往往插件技術應用在框架設計中,系統本身設計簡單化,輕量級,實現基本功能后,其他功能通過插件加入進來,方便擴展。