Как инициализировать класс только один раз и сохранить свойства overidden в Python - PullRequest
0 голосов
/ 27 августа 2018

Я выполняю анализ XML для списка файлов XML. Я использую модуль, который переопределяет класс XMLParser дерева элементов. Это код -

import sys
sys.modules['_elementtree'] = None
try:
    sys.modules.pop('xml.etree.ElementTree')
except KeyError:
    pass
import xml.etree.ElementTree as ET

class Parse():
    def __init__(self):
        self.xmlFiles  = [list_of_xmlFile_paths]

    def parse_xml_files(self):
        for filepath in self.xmlFiles:
            root = ET.parse(filepath, LineNumberingParser()).getroot()
            for elem in root:
                print(elem.start_line_numer, elem.end_line_number)


class LineNumberingParser(ET.XMLParser):
    def _start(self, *args, **kwargs):
        # Here we assume the default XML parser which is expat
        # and copy its element position attributes into output Elements
        self.element = super(self.__class__, self)._start(*args, **kwargs)
        self.element.start_line_number = self.parser.CurrentLineNumber
        self.element.start_column_number = self.parser.CurrentColumnNumber                
        return self.element

    def _end(self, *args, **kwargs):
        self.element = super(self.__class__, self)._end(*args, **kwargs)
        self.element.end_line_number = self.parser.CurrentLineNumber
        self.element.end_column_number = self.parser.CurrentColumnNumber                
        return self.element

Класс LineNumberingParser дает мне начальную строку, конечную строку узла xml. Моя проблема в том, что для каждого файла XML инициализируется класс. Так что эта повторяющаяся инициализация неэффективна. Как я могу сделать это, инициализируя класс только один раз? Может кто-нибудь, пожалуйста, предложите.

1 Ответ

0 голосов
/ 27 августа 2018

Я все еще не уверен, как ты хочешь это сделать? Кажется, класс ET.XMLParser нужно инициализировать для каждого файла ....

Однако, если вы найдете способ обойти это (например, «переинициализируя» переменные объекта ET.XMLParser вручную), вы можете сохранить экземпляр синтаксического анализатора в LineNumberingParser как переменную класса и инициализируйте его только один раз.

...