2009-01-13 51 views
2

我有一段代碼,其中包含for循環以從XML文件中繪製事物;來自for循環的Python類

for evoNode in node.getElementsByTagName('evolution'): 
     evoName = getText(evoNode.getElementsByTagName(  "type")[0].childNodes) 
     evoId  = getText(evoNode.getElementsByTagName(  "typeid")[0].childNodes) 
     evoLevel = getText(evoNode.getElementsByTagName(  "level")[0].childNodes) 
     evoCost = getText(evoNode.getElementsByTagName("costperlevel")[0].childNodes) 

     evolutions.append("%s x %s" % (evoLevel, evoName)) 

目前,它輸出到一個名爲evolutions,因爲它在該代碼的最後一行說,這和其他一些對功能非常類似的功能,我需要它輸出到類,而不是名單。

class evolutions: 
    def __init__(self, evoName, evoId, evoLevel, evoCost) 
     self.evoName = evoName 
     self.evoId = evoId 
     self.evoLevel = evoLevel 
     self.evoCost = evoCost 

如何創建該類的一系列實例,其中每個實例都是對函數的響應?或者什麼是核心實用解決方案?這個人並不是真的需要這個班,但其他人真的需要這個班。

+0

有關樣式的說明,你應該總是命名駱駝case類以大寫字母開頭,不應該是複數。它應該是:class Evolution – Soviut 2009-01-13 20:39:07

+0

您也可以從類字段中移除'evo'前綴,它們可以從類的上下文中推斷出來。保存打字。 :) – Craz 2009-01-13 20:50:08

+0

不要重複自己(DRY):`get = lambda name:getText(evoNode.getElementsByTagName(name)[0] .childNodes)` – jfs 2009-08-30 12:10:45

回答

3
for evoNode in node.getElementsByTagName('evolution'): 
    evoName  = getText(evoNode.getElementsByTagName("type")[0].childNodes) 
    evoId  = getText(evoNode.getElementsByTagName("typeid")[0].childNodes) 
    evoLevel = getText(evoNode.getElementsByTagName("level")[0].childNodes) 
    evoCost  = getText(evoNode.getElementsByTagName("costperlevel")[0].childNodes) 

    temporaryEvo = Evolutions(evoName, evoId, evoLevel, evoCost) 
    evolutionList.append(temporaryEvo) 

    # Or you can go with the 1 liner 
    evolutionList.append(Evolutions(evoName, evoId, evoLevel, evoCost)) 

我重命名了您的列表,因爲它與您的班級共享相同的名稱並且令人困惑。

4

列表理解可能會更清晰。我也希望移居解析邏輯來構造清理實行:

class Evolution: 
    def __init__(self, node): 
     self.node = node 
     self.type = property("type") 
     self.typeid = property("typeid") 
     self.level = property("level") 
     self.costperlevel = property("costperlevel") 
    def property(self, prop): 
     return getText(self.node.getElementsByTagName(prop)[0].childNodes) 

evolutionList = [Evolution(evoNode) for evoNode in node.getElementsByTagName('evolution')] 

或者,你可以使用地圖:

evolutionList = map(Evolution, node.getElementsByTagName('evolution'))