tl; dr
importlib.import_module使用getattr函数导入根模块并使用其名称加载类:
# Standard import
import importlib
# Load "module.submodule.MyClass"
MyClass = getattr(importlib.import_module("module.submodule"), "MyClass")
# Instantiate the class (pass arguments to the constructor, if needed)
instance = MyClass()
说明
您可能不想使用__import__按名称动态导入模块,因为它不允许您导入子模块:
>>> mod = __import__("os.path")
>>> mod.join
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'join'
这是python文档所说的__import__:
注意:这是日常Python编程中不需要的高级功能,与importlib.import_module()不同。
而是使用标准importlib模块按名称动态导入模块。有了getattr那么你可以通过它的名字实例化一个类:
import importlib
my_module = importlib.import_module("module.submodule")
MyClass = getattr(my_module, "MyClass")
instance = MyClass()
您还可以编写:
import importlib
module_name, class_name = "module.submodule.MyClass".rsplit(".", 1)
MyClass = getattr(importlib.import_module(module_name), class_name)
instance = MyClass()
此代码在python≥2.7(包括python 3)中有效。
module = __import__(module, fromlist=[name])只为我工作。