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