簡體   English   中英

從模塊動態導入類

[英]Import class from module dynamically

我在'my_module'放置了名為'my_class'類。 我需要導入這個類。 我試着這樣做:

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

但它說:

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

所以。 正如我所見,它僅適用於模塊,但不能處理類。 如何從模塊導入類?

它期望my_module是一個包含名為'my_class'的模塊的包。 如果您需要動態導入類或一般屬性,只需在導入模塊后使用getattr

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

另外,是的,它只適用於模塊。 記住importlib.import_module是內部importlib.__import__函數的包裝器。 它不提供與完整import語句相同數量的功能,后者與from結合對導入的模塊執行屬性查找。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM