从模块动态导入类

时间:2017-01-16 13:59:21

标签: python python-3.x python-importlib

我在'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

因此。我可以看到它只适用于模块,但不能处理类。如何从模块导入类?

2 个答案:

答案 0 :(得分:16)

期望my_module成为包含名为'my_class'的模块的包。如果您需要动态导入类或属性,请在导入模块后使用getattr

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

此外,是的,它只适用于模块。请记住,importlib.import_module是内部importlib.__import__函数的包装器。它没有提供与完整import语句相同的功能,与from一起,在导入的模块上执行属性查找。

答案 1 :(得分:0)

import importlib
import logging

logger = logging.getLogger(__name__)


def factory(module_class_string, super_cls: type = None, **kwargs):
    """
    :param module_class_string: full name of the class to create an object of
    :param super_cls: expected super class for validity, None if bypass
    :param kwargs: parameters to pass
    :return:
    """
    module_name, class_name = module_class_string.rsplit(".", 1)
    module = importlib.import_module(module_name)
    assert hasattr(module, class_name), "class {} is not in {}".format(class_name, module_name)
    logger.debug('reading class {} from module {}'.format(class_name, module_name))
    cls = getattr(module, class_name)
    if super_cls is not None:
        assert issubclass(cls, super_cls), "class {} should inherit from {}".format(class_name, super_cls.__name__)
    logger.debug('initialising {} with params {}'.format(class_name, kwargs))
    obj = cls(**kwargs)
    return obj