0

我想编写一个函数,该函数将创建一个参数中指定的任何类的实例,并使用任意数量的参数调用该类。

这似乎不起作用:

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

为什么不使用eval

def spawn(tospawn, *args):
     global current_state
     current_state.instance.append(eval("{}(*{})".format(tospawn, args)))
于 2013-02-19T01:50:35.317 回答
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

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 回答