我有以下设置:
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),我不知道如何动态导入特定的必需类。
答案 0 :(得分:1)
使用字典进行此类调度。
import first_handler
import second_handler
dispatch_dict = {
'first': first_handler.FirstHandler
'second': second_handler.SecondHandler
}
现在,假设您的选择位于choice_string
:
instance = dispatch_dict[choice_string]()
答案 1 :(得分:1)
使用__import__
进行导入。请注意,如果您使用子模块,则必须指定fromlist
,否则您将获得顶级模块。因此
__import__('foo.bar', fromlist=['foo']).__dict__['baz_handler']()
将致电foo.bar.baz_handler()
答案 2 :(得分:0)
你可能会这样做:
from first_handler import SameName as handler1
from second_handler import SameName as handler2
handlers = {'UniqueName1': handler1,
'UniqueName2': handler2}
instance = handlers['UniqueName1']()
答案 3 :(得分:0)
这就是诀窍:
import abstract_handler
import first_handler
import second_handler
output = globals()['first_handler']()
答案 4 :(得分:0)
对这个问题的广泛回答。
要动态导入使用__import__(string)
,然后您将找到.__dict__
通过这种方式,您可以基于如下字符串实例:
c = __import__('test.first_handler').__dict__['awesomeclassname']()