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

を使用し__import__てインポートします。サブモジュールを使用する場合は、 を指定する必要があることに注意してくださいfromlist。そうしないと、代わりに最上位モジュールが取得されます。したがって

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

電話します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

これはトリックを行います:

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 に答える
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 に答える