2017-12-04 8 views
1

いくつかのクラスがあるとしましょう:ClassAClassBClassC、およびClassDです。私はさまざまな状況に基づいて設定する変数を持っています。私はそれが前倒しであることを知っていますが、私はそれを変更する必要があるたびに、さまざまなファイルの異なるコード行を書き直す必要はありません。ユーザー設定ではありません。変数名に基づいて異なるクラスを実行しますか?

はだから今、私たちはそうVariable = ClassX

を持っている、のは、私がClassAVariableを設定しましょう。どうすればそれを使ってClassAに電話をかけることができますか?例えば、私はこれを行うことができます知っている:

Variable = ClassA 
if Variable == ClassA: 
    # Call ClassA and run it 
elif Variable == ClassB: 
    # Call ClassB and run it 
elif Variable == ClassC: 
    # Call ClassC and run it 
elif Variable == ClassD: 
    # Call ClassD and run it 

はしかし、私はこのような何かをしたい:

Variable = ClassA 
V = Variable() 

が、このことは可能ですか?

EDIT: もう少し詳しく...

だから私は、このシナリオで使用されている3つのファイルを持っています。

File1.py:

# Class = ClassA 
# Class = ClassB 
Class = ClassC 
# Class = ClassD 
... 
if Class == "ClassA": 
    c = ClassSystem.ClassA 
    short_name = c.get_short_name() 
elif Class == "ClassB": 
    c = ClassSystem.ClassB 
    short_name = c.get_short_name() 
elif Class == "ClassC": 
    c = ClassSystem.ClassC 
    short_name = c.get_short_name() 
elif Class == "ClassD": 
    c = ClassSystem.ClassD 
    short_name = c.get_short_name() 
... 

File2.py:

from Folder.File1 import short_name 
from Folder.ClassSystem import * 
... 
S = short_name() 
S.get_information() 

これは動作するようには思えません。 File2はfile1の変数を参照しています。私はFile1の変数を使用してClassSystemで同じクラスを実行するにはFile2が必要です。

+2

はい、これは完全に可能です。あなたはそれを試しましたか? –

+1

これを確認してくださいhttps://stackoverflow.com/questions/2225038/determine-the-type-of-an-object – VTodorov

+0

@NilsWerner詳細を追加しました。このシナリオでは動作しないようです。 –

答えて

2

はい、完全に可能です。しかし、ifでそれを行うのではなく、最もコンパクトなアプローチは、クラスオブジェクトをクラスオブジェクトの辞書にすることです。

その後、辞書をキーと結果のクラスを呼び出すことができます。

cls_dict = {c.__name__: c for c in {ClassA, ClassB}} 
v = 'ClassA' 
cls_dict[v]() 

クラスのセットは、もちろん、あなたが望む任意の追加のオブジェクトを含むように変更することができます。

1

あなたはeval

c_name = 'ClassA' 
obj = eval(c_name)() 

を使用することができますが、私はevalこれを行うために推奨される方法であるかどうかわからないです。