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 Docо __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).