Динамический импорт класса из модуля

У меня есть класс под названием 'my_class', помещенный в 'my_module'. И мне нужно импортировать этот класс. Я пытался сделать это так:

import importlib
result = importlib.import_module('my_module.my_class')

но он говорит:

ImportError: No module named 'my_module.my_class'; 'my_module' is not a package

Так. Как я вижу, он работает только для модулей, но не может обрабатывать классы. Как я могу импортировать класс из модуля?


person GhostKU    schedule 16.01.2017    source источник


Ответы (2)


Ожидается, что my_module будет пакетом, содержащим модуль с именем 'my_class'. Если вам нужно динамически импортировать класс или вообще атрибут, просто используйте getattr после импорта модуля:

cls = getattr(import_module('my_module'), 'my_class')

Кроме того, да, он работает только с модулями. Помните, что importlib.import_module является оболочкой внутреннего importlib.__import__. Он не предлагает такой же объем функциональных возможностей, как полный оператор import, который в сочетании с from выполняет поиск атрибутов в импортированном модуле.

person Dimitris Fasarakis Hilliard    schedule 16.01.2017
comment
Это круто! Еще один полезный совет по использованию rpartition для строки ``` class_path = 'my_module.my_class' module_name, _, class_name = class_path.rpartition('.') klass = getattr(import_module(module_name), class_name) ``` - person The Doctor; 11.11.2020

person    schedule
comment
Избегайте ответов, содержащих только код. Добавьте текст, чтобы описать происходящее для людей, которые могут этого не понять. Кроме того, использование hasattr с assert противоречит здравому смыслу; вместо этого пусть getattr выдаст свое исключение. - person Dimitris Fasarakis Hilliard; 07.12.2018