0

我有以下设置:

test.py
test\
    __init__.py
    abstract_handler.py
    first_handler.py
    second_handler.py

first_handler.py 和 second_handler.py 包含继承自 abstract_handler 的同名类。

我想在 test.py 中做的是:给定一个包含“first_handler”或任何其他处理程序类的字符串,创建该类的对象。

我发现的大多数解决方案都假设这些类在同一个模块(test.py)中,我不知道如何动态导入特定的所需类。

4

5 回答 5

1

Use the __import__ for importing. Note that if you use submodules, you have to specify the fromlist, otherwise you get the top-level module instead. Thus

__import__('foo.bar', fromlist=['foo']).__dict__['baz_handler']()

Will call foo.bar.baz_handler()

于 2013-08-22T16:46:15.410 回答
1

使用字典进行这种调度。

import first_handler
import second_handler

dispatch_dict = {
    'first': first_handler.FirstHandler
    'second': second_handler.SecondHandler
}

现在,假设您的选择是choice_string

instance = dispatch_dict[choice_string]()
于 2013-08-22T16:40:10.667 回答
0

你可能会做这样的事情:

from first_handler import SameName as handler1
from second_handler import SameName as handler2

handlers = {'UniqueName1': handler1,
            'UniqueName2': handler2}

instance = handlers['UniqueName1']()
于 2013-08-22T16:40:46.427 回答
0

这可以解决问题:

import abstract_handler
import first_handler
import second_handler

output = globals()['first_handler']()
于 2013-08-22T16:43:25.427 回答
0

对这个问题的广泛回答。

动态导入使用__import__(string),然后你会发现所有的对象.__dict__

这样,您可以基于以下字符串进行实例化:

c = __import__('test.first_handler').__dict__['awesomeclassname']()
于 2013-08-22T16:43:31.687 回答