Python的動態載入機制
阿新 • • 發佈:2018-12-21
眾所周知import是用來載入Python模組的,其實import是呼叫內建函式__import__來工作的,這就使我們動態載入模組變成了可能。
- import glob, os
- modules = []
- for module_file in glob.glob('*-plugin.py'): #glob.glob得到當前目錄下匹配字串的檔名
- module_name, ext = os.path.splitext(os.path.basename(module_file)) #將檔名以點號分開
- print(os.path.basename(module_file))
- print(ext)
- module = __import__(module_name) #獲得模組
- fun = getattr(module, 'hello') #根據函式名獲得函式
- print(fun)
- fun()
- modules.append(module)
- for module in modules:
- module.hello()
下面我們來實現一個動態載入的類,當第一次使用該模組時,才會被載入
- class LazyImport:
- def __init__(
- self.module_name = module_name
- self.module = None
- def __getattr__(self, funcname):
- ifself.module isNone:
- self.module = __import__(self.module_name)
- print(self.module)
- return getattr(self.module, funcname)
- string = LazyImport('string'
- print(string.ascii_lowercase)
其中,這個類的__getattr__方法,只有當這個類的物件呼叫了某個方法,並且找不到這個方法的時候會被自動呼叫。
一般象a.b這樣的形式,python可能會先查詢a.__dict__中是否存在,如果不存在會在類的__dict__中去查詢,再沒找到可能會去按這種方法去父類中進行查詢。實在是找不到,會呼叫__getattr__,如果不存在則返回一個異常。那麼__getattr__只有當找不到某個屬性的時候才會被呼叫。