我对python有些经验,但对OOP很糟糕。我会说我在初学者和中级人之间,如果这有帮助的话。
我有一个班级:
class WikiScrape:
def __init__(self, pages=[]):
self.pages = set() #my instance variable
以下是问题的方法
def get_links(self, URL):
pages = self.pages
html = urlopen("https://en.wikipedia.org/%s" % URL)
bsObj = BeautifulSoup(html)
for link in bsObj.findAll('a', href=re.compile(r'^/wiki')):
if 'href' in link.attrs:
if link.attrs['href'] not in pages:
# new page found
new_page = link.attrs['href']
print(new_page)
pages.add(new_page)
self.get_links(new_page)
这样做是检查链接列表中的某些内容是否在所谓的页面集中。我的困惑来自于在get_links()方法中引用此变量。
引用变量,如:
if link.attrs['href'] not in self.pages:
给了我一个名字错误。我的理解是,只要在类实例中定义了实例变量,就可以使用self调用它们。困惑,我尝试了很多东西。
我添加了一行:
pages = self.pages
在函数中它起作用了。
基本上,将变量设置为self.pages而不是在for循环中引用self.pages使得函数运行得很好。
我的问题是,为什么我必须这样做?为什么我不能只引用self.pages而不将其设置为相关方法中的变量。它甚至可以担心吗?有范围的东西?
感谢阅读,如果不清楚,我会很乐意澄清
答案 0 :(得分:0)
我认为自我应该没问题。
但我认为你的代码中有一些奇怪的地方:
你写的get_links函数的最后一行 self.get_links(NEW_PAGE)
对我来说似乎不合理,如果我的理解是对的,你想要的是试图遍历图中的所有节点。
但是你使用self.get_links(),这意味着每次你使用同一个节点来查找链接时,对吗?
以下是目的示例代码:
var $test = $(window).add(document).add("body");
$test.is(function(index, elements) {
return this === window;
});
搜索算法可以帮助您遍历所有节点。
希望这会对你有所帮助。