我有一个收集多个模块的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)
感谢您的回复
答案 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