Сброс переменной класса Python? - PullRequest
0 голосов
/ 26 октября 2018

У меня сейчас есть эта проблема, поэтому у меня есть HTMLParser, использующий класс библиотеки HTMLParser, такой как

class MyHTMLParser(HTMLParser):
    temp = ''
    def handle_data(self, data):
        MyHTMLParser.temp += data

Мне нужна переменная temp, потому что мне нужно сохранить данные в другом месте, чтобы я мог оценить в другом месте.

Мой код использования класса выглядит следующим образом:

for val in enumerate(mylist):
    parser = HTMLParser()
    parser.feed(someHTMLHere)
    string = parser.temp.strip().split('\n')

Проблема в том, что эта временная переменная хранит все, что я сохраняла раньше, она не сбрасывается, даже если яобъявляя новый экземпляр парсера каждый раз.Как очистить эту переменную ???Я не хочу, чтобы это сохраняло все, что есть в предыдущем цикле

Ответы [ 3 ]

0 голосов
/ 26 октября 2018

temp в вашем коде - class attribute, он будет инициализирован только тогда, когда python interpreter впервые увидит этот класс, поэтому temp = '' будет работать только один раз.

Итак, переместите его в__init__ сделать это как object attribute - хорошее решение.

Но, если вы настаиваете на том, чтобы сделать его class attribute, как вы сказали в комментариях:

Можно ли в любом случае объявить глобальную переменную, которая может использоваться внутри класса и в других местах?

Кстати, это нельзя назвать global variable, это class attribute.

Тогда вам пришлось сбросить его самостоятельно.В вашем коде handle_data в качестве обратного вызова будет вызываться feed несколько раз, поэтому нет возможности сделать это в handle_data, вам пришлось делать это вне класса.

Для вашегокод, это может быть что-то вроде следующего с lineA, только к вашему сведению:

class MyHTMLParser(HTMLParser):
    temp = ''
    def handle_data(self, data):
        MyHTMLParser.temp += data

for val in enumerate(mylist):
    parser = MyHTMLParser()
    MyHTMLParser.temp = '' # lineA
    parser.feed(someHTMLHere)
    string = parser.temp.strip().split('\n') # lineB

См. lineA, он сбросит temp на пустое, так что каждый экземпляр не будет влиять друг на друга, даже если вы объявитеэто в начале класса, как вам нужно.

Но, обратите внимание, вы не должны заменять lineA на parser.temp = '' или присваивать какое-либо значение parser.temp.Это создаст новый object attribute с именем temp, тогда parser.temp в lineB больше не будет использовать class attribute, что сделает вашу цель недостижимой.

0 голосов
/ 26 октября 2018

Как уже говорили другие, проблема в том, что вы добавляете данные в переменную класса вместо переменной экземпляра.Это происходит из-за строки MyHTMLParser.temp += data

Если вы измените ее на self.temp += data, она изменит данные каждого экземпляра, а не сохранит их в классе.

Вотполный рабочий скрипт:

from html.parser import HTMLParser

class MyHTMLParser(HTMLParser):
    temp = ""

    """Personally, I would go this route"""
    #def __init__(self):
    #   self.temp = ""
    #   super().__init__()
    """Don't forget the super() or it will break"""

    def handle_data(self, data):
        self.temp += data # <---Only real line change

"""TEST VARIABLES"""
someHTMLHere = '<html><head><title>Test</title></head>\
<body><h1>Parse me!</h1></body></html>'
mylist = range(5)
""""""""""""""""""

for val in enumerate(mylist):
    parser = MyHTMLParser() #Corrected typo from HTML to MyHTML
    parser.feed(someHTMLHere)
    string = parser.temp.strip().split('\n')

    print(string) #To Test each iteration
0 голосов
/ 26 октября 2018

Это происходит потому, что каждый раз, когда вы вызываете MyHTMLParser.temp, вы получаете новую переменную ('').

Что вам нужно сделать, это добавить temp к самому объекту.Вы делаете это в конструкторе:

class MyHTMLParser(HTMLParser):
    def __init__(self):
        self.temp = ''

    def handle_data(self, data):
        self.temp += data

    # use a getter
    def get_temp(self):
        return self.temp

Теперь переменная temp принадлежит к самому объекту.И если у вас есть несколько MyHTMLParser объектов, у каждого из них будет своя собственная переменная temp.

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