2013-08-22 3 views
0

У меня есть следующие настройки:Python создание имени динамического класса

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), я не знаю, как динамически импортировать определенный требуемый класс.

ответ

1

Используйте __import__ для импорта. Обратите внимание: если вы используете подмодули, вы должны указать fromlist, иначе вы получите модуль верхнего уровня. Таким образом

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

Позвоню foo.bar.baz_handler()

1

Используйте словарь для такого рода диспетчеризации.

import first_handler 
import second_handler 

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

Теперь, предполагая, что ваш выбор в choice_string:

instance = dispatch_dict[choice_string]() 
0

Вы могли бы сделать что-то вроде этого:

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

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

instance = handlers['UniqueName1']() 
0

Это делает трюк:

import abstract_handler 
import first_handler 
import second_handler 

output = globals()['first_handler']() 
+0

Хотя у меня есть чувство, что это не одобряется каким-то образом. – Brionius

0

A br Ответ на вопрос.

Для динамического импорта использовать __import__(string), а затем вы найдете все объекты в .__dict__

Таким образом, вы можете экземпляр основан на строки, как:

c = __import__('test.first_handler').__dict__['awesomeclassname']()