Pythonでオブジェクトと関数名に変数を使用する方法を知りたいです。PHPでは、次のことができます。
$className = "MyClass";
$newObject = new $className();
Pythonでこの種のことをどのように行いますか?または、Pythonとの根本的な違いをまったく理解していませんか?もしそうなら、それは何ですか?
Pythonでオブジェクトと関数名に変数を使用する方法を知りたいです。PHPでは、次のことができます。
$className = "MyClass";
$newObject = new $className();
Pythonでこの種のことをどのように行いますか?または、Pythonとの根本的な違いをまったく理解していませんか?もしそうなら、それは何ですか?
some_module に「class_name」という名前のクラスがあると仮定します。
import some_module
klass = getattr(some_module, "class_name")
some_object = klass()
ここで注意が必要なのは、文字列がユーザーからのものである場合、文字列をコードに変換することは危険な場合があるため、この状況ではセキュリティに留意する必要があることです。:)
もう1つの方法(まだ「class_name」を使用していると仮定):
class_lookup = { 'class_name' : class_name }
some_object = class_lookup['class_name']() #call the object once we've pulled it out of the dict
後者の方法はおそらくこれを行う最も安全な方法であるため、可能であれば使用する必要があります。
Pythonでは、
className = MyClass
newObject = className()
最初の行は、変数className
がと同じものを参照するようにしMyClass
ます。次に、次の行で変数MyClass
を介してコンストラクターを呼び出します。className
具体的な例として:
>>> className = list
>>> newObject = className()
>>> newObject
[]
(Pythonでは、list
はlist
クラスのコンストラクターです。)
違いは、PHPでは、参照するクラスの名前を文字列として表すのに対し、Pythonでは同じクラスを直接参照できることです。文字列を使用する必要がある場合(たとえば、クラスの名前が動的に作成される場合)、他の手法を使用する必要があります。
Python で動的クラス (つまり、名前が変数のクラス) を作成する必要がある場合は、name、bases、attrs の 3 つのパラメーターを取る type() を使用できます。
>>> class_name = 'MyClass'
>>> klass = type(class_name, (object,), {'msg': 'foobarbaz'})
<class '__main__.MyClass'>
>>> inst = klass()
>>> inst.msg
foobarbaz
あなたがこれを持っているなら:
class MyClass:
def __init__(self):
print "MyClass"
次に、通常これを行います。
>>> x = MyClass()
MyClass
しかし、これを行うこともできます。これは、あなたが求めていることだと思います。
>>> a = "MyClass"
>>> y = eval(a)()
MyClass
ただし、「eval()」を使用する文字列をどこで取得するかについては十分に注意してください。ユーザーからの文字列の場合、本質的に巨大なセキュリティホールが作成されます。
更新:type()
coleiferの回答に示されているように使用することは、このソリューションよりもはるかに優れています。