Python动态类名创建

时间:2013-08-22 16:36:05

标签: python oop inheritance

我有以下设置:

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),我不知道如何动态导入特定的必需类。

5 个答案:

答案 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']()