【问题标题】:python class variable reset?python类变量重置?
【发布时间】:2018-10-25 22:50:23
【问题描述】:

我现在遇到了这个问题,所以我有一个使用 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')

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

【问题讨论】:

  • 使用self.temp并将temp移动到构造函数中
  • 看起来您正在创建 HTMLParser 的新实例,而不是 MyHTMLParser
  • @jk622 是一样的,我贴错了,但是在我的代码里是一样的

标签: python html-parser


【解决方案1】:

这是因为每次调用 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=' ',然后在类中执行一个全局 temp,但这不起作用
  • 您可以通过构造函数将变量 (temp) 传递到您的 object 中,然后可以由所有人共享和/或在其他地方引用:parser = HTMLParser(temp)
【解决方案2】:

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

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

但是,如果你坚持让它成为class attribute,就像你在 cmets 中所说的那样:

是否有声明一个可以在类内部和其他地方使用的全局变量?

顺便说一句,这不能称为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 分配任何值。这将创建一个名为temp 的新object attribute,然后lineB 中的parser.temp 将不再使用class attribute,从而使您的目标无法实现。

【讨论】:

    【解决方案3】:

    正如其他人所说,问题在于您将数据添加到类变量而不是实例变量。发生这种情况是因为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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-03
      • 1970-01-01
      • 2013-11-05
      • 1970-01-01
      • 1970-01-01
      • 2021-12-25
      • 2015-04-30
      相关资源
      最近更新 更多