web-dev-qa-db-ja.com

Pythonでクラス名に変数を使用していますか?

Pythonでオブジェクトと関数名の変数を使用する方法を知りたい。 PHPでは、これを行うことができます:

$className = "MyClass";

$newObject = new $className();

このようなことをPythonでどのように行うのですか?それとも、Pythonとの根本的な違いをまったく理解していないのですか?

38
Sam McAfee

Pythonでは、

className = MyClass
newObject = className()

最初の行は、変数classNameMyClassと同じものを参照するようにします。次に、次の行はMyClass変数を介してclassNameコンストラクターを呼び出します。

具体的な例として:

>>> className = list
>>> newObject = className()
>>> newObject
[]

(Pythonでは、listlistクラスのコンストラクタです。)

違いは、PHPでは文字列として参照するクラスの名前を表すのに対し、Pythonでは同じクラスを直接参照できます。文字列を使用します(たとえば、クラスの名前が動的に作成される場合)、他の手法を使用する必要があります。

24
Greg Hewgill

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

後者の方法は、おそらくこれを行うための最も安全な方法であるため、可能であれば使用する方法です。

55
Jason Baker

Python(つまり、名前が変数であるクラス)で動的クラスを作成する必要がある場合は、name、bases、attrsの3つのパラメーターを取るtype()を使用できます。

>>> class_name = 'MyClass'
>>> klass = type(class_name, (object,), {'msg': 'foobarbaz'})

<class '__main__.MyClass'>

>>> inst = klass()
>>> inst.msg
foobarbaz
  • ただし、これはオブジェクトを「インスタンス化」しないことに注意してください(つまり、コンストラクターなどを呼び出しません)。同じ名前のnew(!)クラスを作成します。
23
coleifer

これがあれば:

_class MyClass:
    def __init__(self):
        print "MyClass"
_

次に、通常これを行います:

_>>> x = MyClass()
MyClass
_

しかし、あなたもこれを行うことができます。これはあなたが尋ねていると私が思うことです:

_>>> a = "MyClass"
>>> y = eval(a)()
MyClass
_

ただし、「eval()」を使用する文字列をどこで取得するかについては、十分に注意してください。ユーザーからのものである場合は、本質的に巨大なセキュリティホールを作成しています。

更新:コリファーの答えに示されているようにtype()を使用することは、このソリューションよりもはるかに優れています。

8
TimB

私が使う:

newObject = globals()[className]()
0
Yanone