python class 变量重置?

python class variable reset?

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

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

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

我的代码使用 class 看起来像这样:

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

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

发生这种情况是因为每次调用 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 变量。

temp 在你的代码中是一个 class attribute,它只会在第一次 python interpreter 看到这个 class 时初始化,所以 temp = '' 只会 运行一次。

因此,将其移动到 __init__ 以使其成为 object attribute 是一个很好的解决方案。

但是,如果你坚持把它作为 class attribute 就像你在评论中说的那样:

Is there anyway to declare a global variable that can be used inside the class and elsewhere?

顺便说一句,这不能称为 global variable,它是 class attribute.

然后你必须自己重新设置它。在你的代码中,handle_data 作为回调将被 feed 多次调用,所以没有机会在 handle_data 中执行它,你必须在 [=53= 中执行它].

对于您的代码,这可能类似于 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 重置为空,因此即使您根据需要在 class 的开头声明它,每个实例也不会相互影响。

但是,请注意,您不应lineA 替换为parser.temp = '' 或将任何值分配给parser.temp。这将创建一个名为 temp 的新 object attribute,然后 lineB 中的 parser.temp 将不再使用 class attribute,这将使您的目标无法实现.

就像其他人所说的那样,问题是您将数据添加到 class 变量而不是实例变量。这是因为行 MyHTMLParser.temp += data

如果将其更改为 self.temp += data,它将更改每个实例的数据,而不是将其存储在 class。

这是一个完整的工作脚本:

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