Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中创建具有任意参数的类的实例?_Python_Class_Instance - Fatal编程技术网

在Python中创建具有任意参数的类的实例?

在Python中创建具有任意参数的类的实例?,python,class,instance,Python,Class,Instance,我想编写一个函数,该函数将创建在一个参数中指定的任何类的实例,并使用任意数量的参数调用该类 这似乎不起作用: def spawn(tospawn, *args): global current_state current_state.instance.append(globals()[tospawn](*args)) 我做错了什么 编辑:伙计们,我是个白痴。创建此函数的原因是,那些无法访问其他类的类仍然可以创建它们的实例,但它们实际上可以访问其他类。所以没关系。你不能从glob

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

这似乎不起作用:

def spawn(tospawn, *args):
    global current_state
    current_state.instance.append(globals()[tospawn](*args))
我做错了什么


编辑:伙计们,我是个白痴。创建此函数的原因是,那些无法访问其他类的类仍然可以创建它们的实例,但它们实际上可以访问其他类。所以没关系。

你不能从globals中获取类
tospawn
是一种类型,而不是字符串。类型是第一类对象,您可以直接使用它们

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)
至于整个代码,我会用classmethod来代替

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__
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))

为什么不使用
eval

def spawn(tospawn, *args):
     global current_state
     current_state.instance.append(eval("{}(*{})".format(tospawn, args)))

您是否尝试过tospawn(*args)?或者
tospawn
是一个字符串吗?“这似乎不起作用”——详细说明。你有什么错误?错误的确切文本是什么?Tospawn是一个字符串,但会有一个同名的类。这里是错误:AttributeError:'module'对象没有属性'instance',我认为这不起作用,因为我正在向该函数传递一个字符串(与类同名)作为第一个参数。如果我使用tospawn(*args),它将查找名为tospawn的类,而不是与tospawn的值同名的类。