У меня есть фрагмент кода, содержащий цикл 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
Как создать серию экземпляров этого класса, каждый из которых является ответом на функцию? Или каково основное практическое решение? Этому класс действительно не нужен, а вот другому действительно нужен.
Вы также можете удалить префикс «evo» из полей класса, они могут быть выведены из контекста класса. Сохраняет набор текста. :)
Не повторяйся (СУХОЙ): get = lambda name: getText(evoNode.getElementsByTagName(name)[0].childNodes)






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))
Я переименовал ваш список, потому что он имеет то же имя, что и ваш класс, и сбивает с толку.
Не могли бы вы также переименовать их класс в верхний регистр, например, правильные имена классов должны быть?
Я думал, что это только я поместил классы в верхний регистр для первой буквы. Или ты про все буквы?
Понимание списка могло бы быть немного чище. Я бы также переместил логику синтаксического анализа в конструктор, чтобы очистить реализацию:
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'))
property - это встроенная функция Python. Плохой стиль - использовать его так, как ты. docs.python.org/library/functions.html#property
Примечание о стиле, вы всегда должны называть классы верблюжьим регистром, начиная с заглавной буквы, и они не должны быть множественными. Должно быть: class Evolution