如何使用__import__导入类而不是模块

时间:2018-05-31 11:07:42

标签: python import

我正在编写脚本(main_script.py),它应该从以下目录中的某些模块中导入类:

main_script.py
    module1/
        __init__.py
        module1.py

__ init __ .py文件包含以下内容:

from module1.module1 import Module1

module1.py包含一个Module1类。模块2遵循完全相同的架构。

    module2/
        __init__.py
        module2.py

main_script.py应该可以根据某些条件导入类Module1Module2

在main_script.py中:

module_list=['module1.module1', 'module2.module2']

for module in module_list:
    if some_condition:
        mod = __import__(module)
        class_ = getattr(mod, module.split(".")[1])
        setattr(self, m1, class_)

我发现代替类,它只导入模块。有人能让我走上正轨吗?

3 个答案:

答案 0 :(得分:0)

你可以这样做:

    _temp = __import__('foo.bar', globals(), locals(), ['object'], -1) 
object = _temp.object

另见python docs

答案 1 :(得分:0)

您应该避免使用__import__并改为使用importlib

import importlib

module_list = ['module1.module1', 'module2.module2']

for module in module_list:
    if some_condition:
        mod = importlib.import_module(module)
        class_ = getattr(mod, module.split(".")[1].capitalize())
        # Don't forget to capitalize the name of the class!
        setattr(self, m1, class_)

答案 2 :(得分:0)

我解决了它:

1)我采用了eqperes的评论并使用了importlib。 2)我意识到在设置属性之前,我必须创建一个类的实例。所以我补充道:

module_list = ['module1.module1', 'module2.module2']

for module in module_list:
    if some_condition:
        mod = importlib.import_module(module)

        # Don't forget to capitalize the name of the class!
        class_ = getattr(mod, module.split(".")[1].capitalize())

        # Don't forget to make an instance of the class!!
        c=class_()

        setattr(self, m1, c)