2013-08-22 83 views
1

我對python中的類很新,所以請溫和。我的劇本是一點點比這更復雜,但實際上,這就是它歸結爲:Python嵌套類 - 返回多個值

class primary_state: 
    def __init__(self,x,y,z): 
     self.x = x 
     self.y = y 
     self.z = z 
     self.substates=[] 

    def add_substate(self,i,j,k): 
     self.substates.append(self.substate(i,j,k)) 

    class substate: 
     def __init__(self,i,j,k): 
      self.i = i 
      self.j = j 
      self.k = k 

state = primary_state(1,2,3) 
state.add_substate(4,5,6) 
state.add_substate(7,8,9) 

現在我的問題是:是否有可能從每個對象返回值的數組?因此,例如,我想要做的:

state.substates[:].i 

,並使其返回的4和7的價值觀,但很可惜子狀態是一個列表,所以它不能處理它。還必須有一個更有效的方式來做到這一點,但我還沒有完全想到這一點。任何意見/想法將不勝感激!謝謝。

+0

你的問題與嵌套類無關。另外,你不解釋你爲什麼要嵌套這些類。這不是必需的。 –

回答

0

你可以通過調用獲取子狀態的列表:

[substate.i for substate in self.substates]

4

使用list comprehension

[sub.i for sub in state.substates] 

這大致等同於以下:

x = [] 
for sub in state.substates: 
    x.append(sub.i) 

除了短,那就是你可以在其他表達式,而不是一系列的語句中嵌入的表達式。

+0

非常感謝! – Robert

0

列表解析是其他答案指出的方法。

如果主要狀態類的唯一工作是保存子類,那麼可以使您的類像可迭代類似。在你給的例子中,大多是語法糖,但它可能是有用的。

class PrimaryState(object): #always use "new style" classes! its 2013! 
    def __init__(self,x,y,z): 
     self.x = x 
     self.y = y 
     self.z = z 
     self.substates=[] 

    def __len__(self): 
     return len(self.substates) 

    def __getitem__(self, index): 
     return self.substates[index] 

    def __iter__(self): 
     for sub in substates: yield sub 

    def __contains__(self, item): 
     return item in self.substates 

     def add(self, item): 
      self.substates.append(item) 

這樣,你可以這樣做::關於如何做到這一點是here,但它非常簡單,完整的說明

primary = PrimaryState(1,2,3) 
primary.add(SubState(4,5,6)) 
primary.add(SubState(7,8,9)) 

for item in primary: 
    print item 

# Substate 4,5,6 
# Substate 7,8,9 

PS:退房PEP-8,標準的Python風格指南命名類等等。並使用新的樣式類(從對象繼承)。在路上,這很重要!