簡體   English   中英

無法在方法中調用類實例變量

[英]Can't call class instance variable within a method

我對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而不將其設置為相關方法中的變量。 還要擔心嗎? 有范圍嗎?

感謝您的閱讀,如果不清楚,我很樂意澄清

我認為self.pages應該可以。

但是我認為您的代碼中有些奇怪的地方:

get_links函數的最后一行,您編寫self.get_links(new_page)

對於我來說似乎不合理,如果我的理解正確,那么您想要的是嘗試遍歷圖中的所有節點。

但是您使用self.get_links(),這意味着每次您使用同一節點查找鏈接時,對不對?

因此,以下是目標示例代碼:

class Node:
    def __init__(self):
        self.link_hash = {}
        self.is_seen = False

def depth_first_search(node):
     '''
     you can check the search algorithm
     ''' 

搜索算法可以幫助您遍歷所有節點。

希望這對您有幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM