Pythonでオブジェクトと関数名の変数を使用する方法を知りたい。 PHPでは、これを行うことができます:
$className = "MyClass";
$newObject = new $className();
このようなことをPythonでどのように行うのですか?それとも、Pythonとの根本的な違いをまったく理解していないのですか?
Pythonでは、
className = MyClass
newObject = className()
最初の行は、変数className
がMyClass
と同じものを参照するようにします。次に、次の行はMyClass
変数を介してclassName
コンストラクターを呼び出します。
具体的な例として:
>>> className = list
>>> newObject = className()
>>> newObject
[]
(Pythonでは、list
はlist
クラスのコンストラクタです。)
違いは、PHPでは文字列として参照するクラスの名前を表すのに対し、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(つまり、名前が変数であるクラス)で動的クラスを作成する必要がある場合は、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()
を使用することは、このソリューションよりもはるかに優れています。
私が使う:
newObject = globals()[className]()