2013-08-22 149 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

一個br oad回答這個問題。

要動態導入使用__import__(string),然後你會發現在.__dict__

所有對象這種方式,您可以根據像琴絃實例:

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