Классы Python из цикла for - PullRequest
       19

Классы Python из цикла for

2 голосов
/ 13 января 2009

У меня есть кусок кода, который содержит цикл for для рисования вещей из файла XML;

   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

Как создать серию экземпляров этого класса, каждый из которых является ответом для функции? Или каково основное практическое решение? Этот действительно не нуждается в классе, но один действительно нуждается.

Ответы [ 2 ]

4 голосов
/ 13 января 2009

Понимание списка может быть немного чище. Я бы также переместил логику анализа в конструктор, чтобы очистить реализацию:

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'))
3 голосов
/ 13 января 2009
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))

Я переименовал ваш список, потому что он имел то же имя, что и ваш класс, и сбивал с толку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...