Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/313.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_Python 2.7_Class_Oop_Object - Fatal编程技术网

在python中使用函数创建类的实例

在python中使用函数创建类的实例,python,python-2.7,class,oop,object,Python,Python 2.7,Class,Oop,Object,我想定义一个函数,它接受名称、类型和参数列表(类的)作为输入,并使用指定的参数创建给定类型和给定名称的类的实例。并将其保存在以名称作为键值的字典中如何执行? 我试过使用 return globals()['name']=globals()['type](globals("".join(list_of_parameter))) 但它不起作用,我甚至尝试使用eval() 而不是globals(),但它也不起作用 (名称和类型是字符串列表\u参数列表是字符串列表,其中每个字符串都是变量或对象)虽然有

我想定义一个函数,它接受名称、类型和参数列表(类的)作为输入,并使用指定的参数创建给定类型和给定名称的类的实例。并将其保存在以名称作为键值的字典中如何执行? 我试过使用

return globals()['name']=globals()['type](globals("".join(list_of_parameter)))
但它不起作用,我甚至尝试使用
eval()

而不是
globals()
,但它也不起作用


(名称和类型是字符串列表\u参数列表是字符串列表,其中每个字符串都是变量或对象)

虽然有更全面的方法可以做到这一点,但如果您最终实例化了一个您不希望实例化的类,则会非常危险

实现这一点的一个简单方法是拥有一个字典,其中包含允许此代码实例化的所有类,例如:

In [1]: class_dict = { "int" : int, "str" : str }

In [2]: args = [1]

In [3]: i = class_dict["int"](*args)

In [4]: i
Out[4]: 1

In [5]: args = ["test"]

In [6]: s = class_dict["str"](*args)

In [7]: s
Out[7]: 'test'
那么使用

exec(“…”,globals(),locals())

请注意globals()和locals()。 “..”表示python语法中的类init


exec执行代码,全局变量和局部变量表示exec中执行的代码未在exec命名空间中“捕获”。

您不应使用变量(包括类)的名称作为数据。如果您需要能够通过特定字符串引用给定值(例如类),请将其放入字典中,并将该字符串作为键。通过这种方式,您可以准确地知道您的数据可以引用什么

那么,试试这样的方法:

def call_func_in_namespace(callable_name, arg_names, namespace):
    args = (namespace[name] for name in arg_names)
    return namespace[callable_name](*args)
你可以这样称呼它:

namespace = {"int": int, "base": 3, "val": "212102"}

result = call_func_in_namespace("int", ("val", "base"), namespace)

根据您的实际使用情况,您可以尝试很多变化。例如,可调用和参数可能来自不同的名称空间。我强烈建议您不要使用
globals()
作为名称空间。

为什么要尝试使用字符串作为类名,而不是传递类本身?这是可以做到的,但这是一个非常糟糕的主意。实际上,我必须将创建的对象存储在一个字典中,名称为keyValue,这就是为什么我需要指定名称的对象;我不明白,你能解释一下吗?我想让指定类型的对象具有指定的参数请参见编辑,你可以使用列表提供参数,或者如果参数是固定的,你可以直接传递它们