45

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

$className = "MyClass";

$newObject = new $className();

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

4

5 に答える 5

64

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

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

于 2008-10-21T21:33:05.263 に答える
30

Pythonでは、

className = MyClass
newObject = className()

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

具体的な例として:

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

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

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

于 2008-10-21T21:26:09.333 に答える
25

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(!) クラスを作成します)。
于 2010-05-20T15:14:38.470 に答える
8

あなたがこれを持っているなら:

class MyClass:
    def __init__(self):
        print "MyClass"

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

>>> x = MyClass()
MyClass

しかし、これを行うこともできます。これは、あなたが求めていることだと思います。

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

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

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

于 2008-10-21T21:32:34.017 に答える