【问题标题】:Python classes from a for loop来自 for 循环的 Python 类
【发布时间】:2010-10-01 05:44:15
【问题描述】:

我有一段代码,其中包含一个用于从 XML 文件中绘制内容的 for 循环;

   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

如何创建这个类的一系列实例,每个实例都是来自那个for函数的响应?或者什么是核心实用解决方案?这个真的不需要这个类,但其他一个确实需要。

【问题讨论】:

  • 关于风格的说明,你应该总是用大写字母开头的驼峰式命名类,它们不应该是复数。应该是:进化类
  • 您还可以从类字段中删除“evo”前缀,它们可以从类的上下文中推断出来。节省打字。 :)
  • 不要重复自己(DRY):get = lambda name: getText(evoNode.getElementsByTagName(name)[0].childNodes)

标签: python class for-loop


【解决方案1】:

列表推导式可能会更简洁一些。我还将解析逻辑移至构造函数以清理实现:

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'))

【讨论】:

【解决方案2】:
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))

我重命名了您的列表,因为它与您的班级同名并且令人困惑。

【讨论】:

  • 您是否也可以将他们的类重命名为大写,例如正确的类名应该是?
  • 我以为只有我把类作为第一个字母的大写。还是说所有字母?
猜你喜欢
  • 1970-01-01
  • 2017-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-09
  • 2019-03-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多