首页 > 解决方案 > python类变量重置?

问题描述

我现在遇到了这个问题,所以我有一个使用 HTMLParser 库类的 HTMLParser

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

我需要临时变量,因为我需要将数据保存在其他地方,以便我可以在其他地方进行评估。

我的代码使用类如下所示:

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

问题是这个临时变量存储了我之前存储的任何内容,即使我每次都声明解析器的新实例,它也不会重置。我如何清除这个变量???我不希望它保存上一个循环中的任何内容

标签: pythonhtml-parser

解决方案


temp在你的代码中是 a 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.tempobject attributetempparser.templineBclass attribute


推荐阅读