【问题标题】:Python - Dynamic class importPython - 动态类导入
【发布时间】:2011-11-09 16:49:50
【问题描述】:

我有以下文件夹结构:

- 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',
)

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

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,但它似乎无法处理这种导入。反正我能做到这一点吗?

【问题讨论】:

  • 对不起 - 无法弄清楚你想要什么 - 你的伪代码不清楚。然而,Python 确实会处理来自正确位置的 abse 类。这样任何 App1.Class_ 都会看到 App1 模块中定义的“Producer”。
  • 对不起,我尽量说清楚。我已经对帖子进行了编辑,希望它更有意义。

标签: python python-import


【解决方案1】:

你可能想看看:

  • __import__() 以字符串形式导入模块;
  • dir() 获取模块所有对象的名称(属性、函数等);
  • inspect.isclass(getattr(<module ref>, <object name>)) 识别模块对象中的类;
  • issubclass() 识别给定类的子类,as explained here

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

我正在使用这种机制从给定模块动态实例化类,以便在上层自动考虑它们的更新。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-12
    • 2012-06-21
    • 2019-02-08
    • 1970-01-01
    • 2011-04-17
    • 2016-10-19
    • 2012-01-10
    • 1970-01-01
    相关资源
    最近更新 更多