gpt4 book ai didi

Python:如何在派生类中添加一个空列表

转载 作者:太空宇宙 更新时间:2023-11-04 06:01:17 25 4
gpt4 key购买 nike

是的,我是 python 的新手。这是我学习后的第一个程序。

这是一个 HTML 爬虫,用于获取某个站点上的所有 mp3 文件。

我已经完成了这项工作,但遇到了两个问题,这是我所经历的:

我试图添加一个从 HTMLParser 派生的类。

class MyHTMLParser(HTMLParser.HTMLParser):
def handle_starttag(self, tag, attrs):
pass

它起作用了。所以我尝试添加一个列表成员来记住它遇到的每个 URL。

class MyHTMLParser(HTMLParser.HTMLParser):
urlList = []
def handle_starttag(self, tag, attrs):
pass

但很快我发现它就像C++中的“静态”类成员。

在 python 中,我们不需要在使用前声明成员。

所以代码转到:

class MyHTMLParser(HTMLParser.HTMLParser):
def handle_starttag(self, tag, attrs):
if something:
self.urlList.append(target)

但是 python 在运行时弹出一些错误,说 MyHTMLParser 没有“urlList”的属性。

我很困惑,为什么python不会自动添加它?

所以我添加了这样的“初始化”(和我脑海中的“声明”):

class MyHTMLParser(HTMLParser.HTMLParser):
def __init__(self):
self.urllist = []
def handle_starttag(self, tag, attrs):
if something:
self.urlList.append(target)

但是在这种形式下,python 告诉我一些关于 HTMLParser 的错误,我发现这是因为我没有调用父 init()。

所以代码转到:

class MyHTMLParser(HTMLParser.HTMLParser):
def __init__(self):
#DO PARENT CLASS INIT
self.urllist = []
def handle_starttag(self, tag, attrs):
if something:
self.urlList.append(target)

#DO PARENT CLASS INIT,我发现下面列出了两种方法。

一个是愚蠢的,我去了 HTMLParser 库,发现它在 init() 中做了什么并复制了:

self.reset() #it's what HTMLParser did in __init__()

HTMLParser.HTMLParser.__init__(self) 

我知道它可行但很难看,所以我的问题是:

1,重载时调用父类init()方法的优雅方式。

2,如何像我在代码中列出的那样在没有“声明”的情况下添加列表成员。

最佳答案

要调用父类方法,您只需使用 super(<currentClass>, self).method(<parent method arguments>) .在你的情况下,它会是这样的

class MyHTMLParser(HTMLParser.HTMLParser):
def __init__(self):
#python 3
super(MyHTMLParser, self).__init()
# in python 2 HTMLParser is an old-style class, so the above won't work
HTMLParser.HTMLParser.__init__(self)

引用 super manual

从“声明”开始 - 看起来您误解了“声明”在 Python 中的含义。当您尝试阅读 某些内容时,Python 不会自动创建内容。所以,通过做

self.my_urllist = []

您只需告诉它创建一个空列表并将其存储在 my_urllist类(class)成员。这不是“声明”,而只是一个评估。然而,

self.my_urllist.append(target)

读作“请阅读 self.my_urllist 而不是尝试调用 append 方法”。这里有两件事可能会出错:(1) self.my_urllist不存在; (2) self.my_urllist没有append方法。

所以,为了让它工作,你必须确保在你做之前 self.my_urllist.append你实际上有 self.my_urllist成员,它是一个列表。 Pythonic 的方法是创建 my_urllist__init__并为其分配一些合理的值(在您的情况下为空列表)。

如果您绝对不想覆盖 __init__你可以使用称为 *lazy initialization 的技术,就像这样:

class MyHTMLParser(HTMLParser.HTMLParser):
@property
def my_urllist(self):
if not hasattr(self, '_my_urllist'):
self._my_urllist = []
return self._my_urllist

property 是一个使方法看起来像属性的装饰器。但无论如何,一些对象属性 ( _my_urllist ) 被创建和初始化,它只是延迟到你真正需要它的时候。

关于Python:如何在派生类中添加一个空列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24927644/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com