Python - 动态类导入

时间:2011-11-09 16:49:50

标签: python python-import

我有以下文件夹结构:

- MyProject
    - App1
        - some_module1.py
        - some_module2.py
    - App2
        - some_other_module1.py
        - some_other_module2.py

在每个模块(例如some_module1.py)中,有一个类从基类扩展,在我的例子中是Producer。

我要做的是在这个类中动态加载。为此,我有一个“已安装的应用程序”列表,如下所示:

INSTALLED_APPS = (
    'App1',
    'App2',
)

我正在尝试编写一个函数来检查特定生产者类的每个“app”包,并确保它从生成器基类扩展。像这样:

module_class = 'some_module1.SomeClass'

# Loop through each package in the INSTALLED_APPS tuple:
for app in INSTALL_APPS:
    try:
        #is the module_class found in this app?
        #App1.some_module1.SomeClass - Yes
        #App2.some_module1.SomeClass - No

        # is the class we found a subclass of Producer?
    exception ImportError:
        pass

我尝试过使用imp和importlib,但它似乎没有处理这种导入。无论如何我能够做到这一点吗?

1 个答案:

答案 0 :(得分:5)

您可能需要查看:

  • __import__()导入模块,知道其名称为字符串;
  • dir()获取模块所有对象的名称(属性,函数等);
  • inspect.isclass(getattr(<module ref>, <object name>))识别模块对象中的类;
  • issubclass()标识来自给定班级的子类as explained here

使用这些工具,您可以识别给定模块中继承给定类的所有类。

我正在使用此机制动态实例化给定模块中的类,以便在上一级自动考虑它们的更新。