2015-10-21 104 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()作爲命名空間。

相關問題