2015-10-21 72 views
0

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

return globals()['name']=globals()['type](globals("".join(list_of_parameter))) 

尝试,但它没有工作,我甚至试过用eval()

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

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

+3

你为什么要使用类名字符串而不是传递类本身?它可以完成,但这是一个非常糟糕的主意。 – Blckknght

+0

其实我必须存储在名称为keyValue的字典中创建的对象,这就是为什么我需要指定名称的对象。 – Yogendra

回答

0

虽然有更多的包罗万象的方法可以做到这一点,它可以是如果你最终很危险实例化一个你不期待的类。

一种简单的方式来完成,这是必须的所有类的字典,你会允许这样的代码来实例化,例如:

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' 
+0

我想拥有指定参数的对象 – Yogendra

+0

请参阅编辑,您可以使用列表提供参数,或者如果参数是固定的,您可以直接传递它们 – user2085282

0

有关使用

exec("...", globals(), locals())

什么注意globals()和locals()。 “...”代表python语法中的类init。

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

+0

我不明白,请你解释一下位? – Yogendra

0

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

因此,尝试这样的事情:

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()作为命名空间。

相关问题