在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,这就是为什么我需要指定名称的对象;我不明白,你能解释一下吗?我想让指定类型的对象具有指定的参数请参见编辑,你可以使用列表提供参数,或者如果参数是固定的,你可以直接传递它们