无法在方法中调用类实例变量

时间:2015-09-11 00:40:19

标签: python oop

我对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而不将其设置为相关方法中的变量。它甚至可以担心吗?有范围的东西?

感谢阅读,如果不清楚,我会很乐意澄清

1 个答案:

答案 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;
});

搜索算法可以帮助您遍历所有节点。

希望这会对你有所帮助。