0

我有一个收集多个模块的 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)

感谢您的回复

4

2 回答 2

0

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

于 2012-11-05T09:55:44.333 回答
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
于 2012-11-05T10:09:12.457 回答