1. 程式人生 > >Python的動態載入機制

Python的動態載入機制

眾所周知import是用來載入Python模組的,其實import是呼叫內建函式__import__來工作的,這就使我們動態載入模組變成了可能。

  1. import glob, os  
  2. modules = []  
  3. for module_file in glob.glob('*-plugin.py'):        #glob.glob得到當前目錄下匹配字串的檔名
  4.         module_name, ext = os.path.splitext(os.path.basename(module_file))      #將檔名以點號分開
  5.         print(os.path.basename(module_file))  
  6.         print(ext)  
  7.         module = __import__(module_name)        #獲得模組
  8.         fun = getattr(module, 'hello')      #根據函式名獲得函式
  9.         print(fun)  
  10.         fun()  
  11.         modules.append(module)  
  12. for module in modules:  
  13.     module.hello()  

下面我們來實現一個動態載入的類,當第一次使用該模組時,才會被載入
  1. class LazyImport:  
  2.     def __init__(
    self, module_name):  
  3.         self.module_name = module_name  
  4.         self.module = None
  5.     def __getattr__(self, funcname):  
  6.         ifself.module isNone:  
  7.             self.module = __import__(self.module_name)  
  8.             print(self.module)  
  9.         return getattr(self.module, funcname)  
  10. string = LazyImport('string'
    )  
  11. print(string.ascii_lowercase)  

其中,這個類的__getattr__方法,只有當這個類的物件呼叫了某個方法,並且找不到這個方法的時候會被自動呼叫。

一般象a.b這樣的形式,python可能會先查詢a.__dict__中是否存在,如果不存在會在類的__dict__中去查詢,再沒找到可能會去按這種方法去父類中進行查詢。實在是找不到,會呼叫__getattr__,如果不存在則返回一個異常。那麼__getattr__只有當找不到某個屬性的時候才會被呼叫。