2012-12-21 48 views
1

我有字符串列表my_list有n個項目在其中。 該列表在運行期間被輸入一個字符串。 假設現在有4個項目。我該如何找回一個類的動態創建的對象?

示例:my_list = [ '一個', '2', '3', '4']

我有稱爲my_object自定義對象,其實例我需要一個創造循環,列表中的每個項目

我的問題: 通常情況下,我創建對象爲:**my_obj** = MyObj(),我可以使用my_obj變量得到它並調用其方法等

因爲我需要這個創作動態地發生,與列表操作;

  • 如何創建對象實例?
  • 如何獲取對象實例並調用其方法?

我知道這是舊的,可​​能是錯誤的,過時的,但在VisualBasic中的可視項目,這可能已經等來進行:

my_obj [dyanmic_variable] = ...

我不想這樣涉及全局或任何事情都很複雜。

我該如何處理這個問題?

更多的上下文:

*我使用Qt開發應用程序(PySide - PyQt的)。 我有一個定製的微件(my_class) 我需要這個對象的動態創建的實例來填充可視列表(QGridLayout),然後調用它們的方法。*

謝謝。顯示我創建對象,並嘗試使用它們

代碼:

class my_class(object): 
    def __init__(self): 
     print 'hi' 
    def talk(w): 
     print w 

my_list = ['one', 'two'] 

### code that won't work starts from here 
for i in list: 
    i = my_class() 

my_list[1].talk() 
+1

請顯示實際的代碼,演示你正在嘗試要做什麼以及它不起作用。 – BrenBarn

+0

代碼究竟是什麼?我很樂意這樣做,但這就是我所要求的。我有一個隨意的自定義類,它什麼都沒做。我的問題是如何創建動態實例,我不知道它的代碼。 – Phil

+1

您可以通過調用一個類來創建一個對象,例如'MyClass的()'。沒有要求將其分配給變量。你的「問題」聽起來很愚蠢,我認爲我們缺少背景。顯示代碼。 –

回答

1

我想你可能會對Python中「變量」和「名稱」的含義感到困惑。

對象沒有名稱。說foo = 1不會對1對象做任何事情,除了增加引用計數。

變量是字符串到名稱空間內對象的映射。名字空間是用字典來實現的。您可以使用locals()函數訪問本地命名空間。

實施例:

Python 2.7.1 (r271:86832, Jun 16 2011, 16:59:05) 
[GCC 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2335.15.00)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> locals() 
{'__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__', '__doc__': None, '__package__': None} 
>>> a = 1 
>>> locals() 
{'__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__', '__doc__': None, 'a': 1, '__package__': None} 
>>> 

注意, 'A':1只出現在locals()字典。

你的問題仍然不清楚,因爲你沒有顯示任何代碼與你想完成的任務和你卡在哪裏。可能最好的方式來做我認爲你正在嘗試做的事(儘管沒有必要如何做你想做的事)是使用字典:

>>> class MyClass(object): pass 
... 
>>> myobjects = {} 
>>> myobjects['key-name'] = MyClass() 
>>> myvar = myobjects['key-name'] # some time later... 
>>> myvar # what is myvar? 
<__main__.MyClass object at 0x10f7c1c50> 
>>> myobjects['key-name'] # myobjects['key-name'] is the same object 
<__main__.MyClass object at 0x10f7c1c50> 
>>> 
3

你只是說你要創建的對象沒有名稱的列表?剛做這樣的事情:

myObjs = [MyObj() for i in range(5)] 

然後你可以用myObjs[0]myObjs[1]訪問每個對象等

此外,閱讀the Python tutorial以熟悉創建類的實例,列表等的基本知識蟒蛇。

編輯:你在評論中描述的內容(使用給定名稱創建變量)不是一個好主意。創建動態變量名稱是沒有意義的,因爲如果不知道變量名稱是什麼,就不能在代碼中使用它。最好使用列表或字典。對於一個字典,你可以這樣做:

myObjs = {} 
theName = getNameSomehowFromUser() 
myObjs[theName] = MyObj() 

然後做,因爲經常只要你想,加入到名爲myObjs的字典的新對象。

+0

@BrenBam,謝謝你的回答。我瞭解你的建議方式。所以基本上你建議我應該創建一個新的對象列表並使用列表索引來檢索它們?我明白這一點,謝謝你,我會應用它。不過,我必須告訴你,我確實閱讀了很多關於Python和文檔的知識,並完成了課程。我只是認爲會有一種內置的方式來動態命名實例並在以後像古代VisualBasic中那樣實現它們。 – Phil

+0

@菲爾你的意思是字典嗎?那是你要的嗎? – Marcin

+0

@Marcin,設想一個應用程序在運行時從用戶那裏接收一個字符串。我希望Python創建一個類的實例,並將接收到的字符串作爲變量名,然後在稍後使用該字符串檢索創建的實例。 – Phil

0

我如何解決這個問題:

我決定用所謂的「情況」,而我追加所有新創建的實例的類屬性。這可以是一個字典或一個列表。然後可以使用字符串或索引int來檢索它們。

太棒了。

相關問題