'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
そう。ご覧のとおり、これはモジュールに対してのみ機能しますが、クラスを処理できません。モジュールからクラスをインポートするにはどうすればよいですか?
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