我有以下文件夹结构:
- 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,但它似乎没有处理这种导入。无论如何我能够做到这一点吗?
答案 0 :(得分:5)
您可能需要查看:
__import__()
导入模块,知道其名称为字符串; dir()
获取模块所有对象的名称(属性,函数等); inspect.isclass(getattr(<module ref>, <object name>))
识别模块对象中的类; issubclass()
标识来自给定班级的子类as explained here。使用这些工具,您可以识别给定模块中继承给定类的所有类。
我正在使用此机制动态实例化给定模块中的类,以便在上一级自动考虑它们的更新。