2012-11-05 56 views
0

我有一個收集多個模塊的python包。在這些模塊中,我有一個Component類的多個類。我想使這些類的負載變爲動態的,並動態地構建一些對象。動態類導入和對象構建

ex: 
package/module1.py 
     /module2.py 
module1.py

,存在多個類從類元器件,與module2.py相同,類當然數量和包未知heriting。最終用戶定義哪個對象必須在配置文件中構建。爲了通過模塊,我使用正在工作的pkgutil.iter_modules。從我負責構建組件的功能,我這樣做:

[...] 
myPckge = __import__('package.module1', globals(), locals(), ['class1'], -1) 
cmpt_object = locals()[component_name](self, component_prefix, *args) 
[...] 

但是,這是行不通的類不能被識別,以下的作品,但不是動態的:

cmpt_object = myPckge.class1(self, component_prefix, *args) 

感謝您的回覆

回答

0

您可以使用execfile()實時加載模塊,然後使用exec()從它們創建新對象。但我不明白你爲什麼這樣做!

0

爲了找到一個類的子類指定的模塊中,你可以這樣做:

import inspect 
def find_subclasses(module, parent_cls): 
    return [clazz for name, clazz in inspect.getmembers(module) 
     if inspect.isclass(clazz) and 
     issubclass(clazz, parent_cls) and 
     clazz.__module__ == module.__name__ and # do not keep imported classes 
     clazz is not parent_cls] 

注意parent_cls不必是一個類的直接父要返回它。

然後,您可以動態地從模塊加載類,知道模塊的名稱和目錄以及所需類的父類。

import imp 
def load_classes(module_name, module_dir, parent_cls): 
    fle, path, descr = imp.find_module(module_name, [module_dir]) 
    if fle: 
     module = imp.load_module(module_name, fle, path, descr) 
     classes = find_subclasses(module, parent_cls) 
     return classes 
    return [] # module not found