2012-11-08 47 views
1

我正在研究一個python項目,其中有一堆已創建的類。 我將要求用戶輸入要執行的類(即類的名稱,其列表將顯示給他)。如何通過列表創建一個類的實例

他選擇了一個選擇後,我想創建一個用戶請求的類的實例並顯示相應的輸出。

的情況是這樣的......

""" 
My Class definitions go up here... 
""" 


classList = {'a':'AClass','b':'BClass','c':'CClass'} 
for i in iter(classList): 
    print i 
x = raw_input('Enter class name: ') 'Get the user input and store it.' 
""" 
I'm stuck here. 
Have to create an instance for the requested class. 
i.e., have to create an instance to AClass if the user entered a (classList[a]) 
""" 

一個過程,我知道,但模糊的方法是使用交換機的情況下或者如果其他檢查輸入和對應的類創建實例。但是,我是python的新手,所以我想知道是否還有其他方法可以更優雅地實現這一點?

+0

根據記錄,'「」」 ... 。「」「*不是python」block comment「*(儘管我已經多次使用過這種方式)。它會創建一個字符串以被丟棄,並可能導致縮進錯誤。 – mgilson

回答

2

而是在classList存儲類的名字,你可以存儲類本身:

class AClass(object): pass 
class BClass(object): pass 
class CClass(object): pass 

classList = {'a':AClass, 'b':BClass, 'c':CClass} 

這樣,實例名稱存儲在x類很簡單,只要

obj = classList[x]() 
+0

你能詳細解釋一下這個嗎..我的意思是存儲類,我不知道 – Rajesh

+0

在Python中,類本身就是運行時對象。您可以存儲對類的引用,就像存儲對其他對象的引用一樣。我的答案中的代碼說明了這一點。 – NPE

+0

非常感謝。它幫助了我。 – Rajesh

0

你已經過得不錯了,但你需要記住,你可以通過類。因此,這會工作:

class A(): pass 

class B(): pass 

map = {'a': A, 'b': B} 

instance = map['a']() 
+2

我不會使用'map'作爲變量名稱 - 你以這種方式影響內置。也許是'class_mapping'? – mgilson

+0

@mgilson地圖功能應該是死的BTW ... – JBernardo

+0

@JBernardo - 這可能是你的意見,但我見過很多*所以使用它並獲得upvoted的答案,顯然不是每個人都同意這種觀點。由於像'multiprocessing.Pool.map'這樣的行爲大致相同,所以知道它也很有用。在Guido決定執行它之前,'map'永遠不會死亡......我不認爲他會在短時間內殺死它,所以我們不妨用類似的方式來對待它,以便我們給其他內建的東西(例如'list')你可能會認爲這也是沒有必要的 - 它和'list(obj)== [x for obj]' – mgilson

0

如果你仍然想創建一個字符串的類的實例,然後這裏有我的香草功能爲:

def get_object_type(classname, modulename): 
    __import__(modulename) 
    return getattr(sys.modules[modulename], classname) 

def get_object_instance(classname, modulename, param={}): 
    return get_object_type(classname, modulename)(**param) 

new_instance = get_object_instance("ClassA", "modulename") 
相關問題