动态类导入和对象构建

时间:2012-11-05 09:51:41

标签: python

我有一个收集多个模块的python包。在这些模块中,我有一个从Component类中删除的多个类。我想动态加载这些类并动态构建一些对象。

ex: 
package/module1.py
       /module2.py

module1.py中,有多个类来自类Component,与module2.py相同,当然类和包的数量是未知的。最终用户定义必须在配置文件中构建哪个对象。为了通过模块,我使用正在运行的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)

感谢您的回复

2 个答案:

答案 0 :(得分:0)

您可以使用execfile()动态加载模块,然后使用exec()从中创建新对象。但我不明白你为什么要这样做!

答案 1 :(得分: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