2009-07-27 16 views
4

クラスCがあるとします。Pythonでは、変数からクラスをインスタンス化する正しい方法は何ですか?

o = C()と書くと、Cというインスタンスが作成され、oに割り当てられます。

しかし、クラス自体を変数に代入してインスタンス化したいのですが?実際instantiate()の構文は何

if (something): 
    classToUse = C1 
else: 
    classToUse = C2 

o = classToUse.instantiate() 

例えば、私は、このようなC1C2として2つのクラスを、持っている、と私はのような何かをしたいと仮定? __new__()への電話は十分ですか?

答えて

14
o = C2() 

これは、あなたが望むものを達成します。または、classToUseを使用する場合は、次のコードを使用してください:

o = classToUse() 

希望します。

+0

したがって、変数にadding()のセマンティクスは、「クラスとして扱い、インスタンス化する」ことを意味します。 – Uri

+3

()は「これを呼び出す」ことを意味します。クラスを呼び出すと、それをインスタンス化することを意味します。背後では、何かを呼び出すと__call__メタメソッドが呼び出されます。このメソッドを使用して、クラス*インスタンス*を呼び出し可能にすることができます。 – Cide

+0

前のコメントでは、コールはおそらく '__call __()'でなければなりません。 (今度は書式設定がうまくいくことを願っています) –

1

単純ですが、Pythonは変数がクラスまたは関数である場所を認識しません。それはその価値を呼ぶだけです。

class A: 
    pass 
B=A 
b=B() 
10

あなたはほぼあります。 instantiate()メソッドを呼び出す代わりに、変数を直接呼び出すだけです。これは、クラスに割り当てられ、そしてクラスは呼び出し可能ですです:

if (something): 
    classToUse = C1 
else: 
    classToUse = C2 

o = classToUse() 
0

クラスがちょうど何か他のもののようなオブジェクトである、例えば、機能、文字列のように...クラスもインスタンスです。だから、変数に格納することができます(またはどこにいても保存することができます)。どこから来ても()で呼び出すことができます。

def f(): print "foo" 

class C: pass 

x = f 
x() # prints foo 

x = C 
instance = x() # instanciates C 
関連する問題