2013-08-23 101 views
0

我的要求是使用變量值來引用Python中的類/字典。作爲一個樣本例子,我有以下數據: -在Python中使用變量值作爲字典/類名

class test1: 
    pass 

class test2: 
    pass 

test1_dict = {} 
test2_dict = {} 

testvariable = "test1" 

現在我要檢查的testvariable價值,創造類的實例,並在字典中添加它。

例如

if testvariable == "test1": 
    test1inst = test1() 
    test1_dict["test1"] = test1inst 
elif testvariable == "test2": 
    test2inst = test2() 
    test2_dict["test2"] = test2inst 

在上面的代碼,我必須明確地使用if/else檢查的testvariable價值,並做相應的操作。

在我的真實情況下,我可能有多個值testvariable,並且可能有多個地方需要檢查if/else。那麼,有可能以某種方式,我可以直接使用testvariable的值來引用字典/類實例,而不使用if/else

+0

在這裏看到:http://stackoverflow.com/questions/452969/does-python-have-an - 等價於java類 - forname – 2013-08-23 08:35:54

+0

你得到的錯誤是什麼? – thefourtheye

+0

明白了,我需要使用字典及其方法來管理數據。修正它,謝謝。 – sarbjit

回答

9

幾乎從來沒有查找這樣的名字的好理由。 Python有一個完美的數據結構來映射名稱到對象,這是一個字典。如果你發現自己說「我需要動態查找某些東西」,那麼字典就是答案。你的情況:

from collections import defaultdict 
test_classes = { 
    'test1': test1, 
    'test2': test2 
} 
test_instances = defaultdict(list) 
test_instances[testvariable].append(test_classes[testvariable]) 
+0

我同意你的看法,但我在實際的代碼中遇到了實現相同的問題。請參閱我的編輯,它更密切地代表我的實際問題。 – sarbjit

0

我與丹尼爾·羅斯曼認爲,有幾乎從來沒有一個很好的理由這樣做。但是,我迎接挑戰!任擇議定書跟隨我自己的危險。

的祕密是使用Python的exec功能,允許執行字符串作爲Python代碼的內容:

所以,

if testvariable == "test1": 
    test1inst = test1() 
    test1_dict["test1"] = test1inst 
elif testvariable == "test2": 
    test2inst = test2() 
    test2_dict["test2"] = test2inst 

成爲

exec("%sinst = %s()" % (testvariable, testvariable)) 
exec("%s_dict[testvariable] = %sinst" % (testvariable, testvariable)) 

雖然並警告在OP的情況下,testvariable的其他值什麼也不做,並且在使用exec()的情況下導致NameError異常。

+0

不,不好主意。你可以通過在局部變量或全局變量中查找類來做同樣的事情:inst = locals()[testvariable] – daveydave400

+0

非常正確,儘管這個方法並不需要從它的範圍之內進行測試。另外,我認爲我的回答明確表示這樣做不是個好主意。 :) –

+1

是的,我剛看到「exec」,去了一個非常黑暗的地方。 :) – daveydave400

0

我將結合其他一些帖子,並說Python已經有一個字典,將對象的名稱映射到對象。您可以訪問局部和全局變量所以只要你的類模塊中定義的,你可以這樣做:

my_inst[testvariable] = locals()[testvariable]()