0

1 つの引数で指定されたクラスのインスタンスを作成し、任意の数の引数でそのクラスを呼び出す関数を作成したいと考えています。

これはうまくいかないようです:

def spawn(tospawn, *args):
    global current_state
    current_state.instance.append(globals()[tospawn](*args))

私は何を間違っていますか?

編集:皆さん、私はばかです。この関数を作成する理由は、他のクラスにアクセスできないクラスでもそれらのインスタンスを作成できるようにするためですが、実際には他のクラスにアクセスできます。だから気にしないでください。

4

4 に答える 4

0
class MyClass(object):
    def __init__(self, a, b, c, d=None):
        print a, b, c, d

args, kwargs = [1,2], {'c':3, 'd':4}
tospawn = MyClass

tospawn(*args, **kwargs)
于 2013-02-18T22:54:45.303 に答える
0

グローバルからクラスをフェッチすることはできません。tospawnは型であり、文字列ではありません。タイプはファーストクラスのオブジェクトであり、直接使用できます。

コード全体に関しては、私は代わりに個人的にクラスメソッドを使用してこれを行います。

class Spawner:
    __spawned__ = []

    @classmethod
    def spawn(cls, tospawn, *args, **kwargs):
        obj = tospawn(*args, **kwargs)
        cls.__spawned__.append(obj)

class TestClass:
    def __init__(self, *args):
        print args

Spawner.spawn(TestClass, "these", "are", "args")
print Spawner.__spawned__
于 2013-02-18T23:00:15.377 に答える
0

なぜ使用しないのevalですか?

def spawn(tospawn, *args):
     global current_state
     current_state.instance.append(eval("{}(*{})".format(tospawn, args)))
于 2013-02-19T01:50:35.317 に答える
0

globals()文字列キーを持つ辞書を返します。何かのようなもの

    from collection import deque

    args = range(20), 3
    a = globals()['deque'](*args)

動作しますが、次の場合は重要なエラーが発生します

    a = globals()[deque](*args)

deque は文字列ではなく型であるためです。

多分あなたは次のようなことができます:

def spawn(tospawn, *args):
    global current_state
    try:
        current_state.instance.append(globals()[tospawn](*args))
    except KeyError:
        current_state.instance.append(tospawn(*args))
于 2013-02-18T23:01:36.920 に答える