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