Python - 动态类导入

Han*_*pan 5 python python-import

我有以下文件夹结构:

- MyProject
    - App1
        - some_module1.py
        - some_module2.py
    - App2
        - some_other_module1.py
        - some_other_module2.py
Run Code Online (Sandbox Code Playgroud)

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

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

INSTALLED_APPS = (
    'App1',
    'App2',
)
Run Code Online (Sandbox Code Playgroud)

我正在尝试编写一个函数来检查特定生成器类的每个"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
Run Code Online (Sandbox Code Playgroud)

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

Joë*_*oël 5

你可能想看看:

  • __import__() 导入模块,知道他们的名字是字符串;
  • dir() 获取模块的所有对象的名称(属性,函数等);
  • inspect.isclass(getattr(<module ref>, <object name>)) 识别模块对象中的类;
  • issubclass()识别来自给定类的子类,如此处所述.

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

我正在使用此机制动态地实例化给定模块中的类,以便在较高级别自动考虑它们的更新.