2013-07-13 61 views
0

我試圖測試以下簡單對象:Python的全局名稱沒有定義

class WebCorpus(object): 
    def __init__(self): 
     _index = {} 
     _graph = {} 
     _ranks = {} 
     _corpusChanged = False 

    def lookup(self, keyword): 
     if keyword in _index: 
      return _index[keyword] 
     return None 
# (some irrelevant code) 

有了:

from WebCorpus import WebCorpus 

def test_engine(): 
    print "Testing..." 
    content = """This is a sample <a href="http://www.example.com">webpage</a> with 
    <a href="http://www.go.to">two links</a> that lead nowhere special.""" 
    outlinks = ["http://www.example.com", "http://www.go.to"] 

    corpus = WebCorpus() 
    assert corpus.lookup("anything") == None 
#(some more code) 
test_engine() 

但它給我一個錯誤:NameError:全局名稱 '_index' 是沒有定義的。我不明白這一點,_index在__init__明確定義!我在這裏犯了什麼錯誤? 幫助讚賞。

回答

4

爲了設置類變量在類的方法,你應該使用self

class WebCorpus(object): 
    def __init__(self): 
     self._index = {} 
     self._graph = {} 
     self._ranks = {} 
     self._corpusChanged = False 

    def lookup(self, keyword): 
     if keyword in self._index: 
      return self._index[keyword] 
     return None 

或者,您可以簡化代碼,並設置這樣的變量(我也簡化lookup法):

class WebCorpus(object): 
    _index = {} 
    _graph = {} 
    _ranks = {} 
    _corpusChanged = False 

    def lookup(self, keyword): 
     return self._index.get(keyword) 

請注意,第二個示例與第一個示例不同,因爲使用了類級變量,請參閱下面的註釋。

+0

哦,非常感謝。 –

+1

這兩個例子並不等同,在第二種情況下,所有的WebCorpus實例將共享'_index','_graph'和'_ranks'屬性,因爲它們是類屬性而不是實例屬性。 –

+0

同意,但請記住'__init __。py'不接受任何論據,我認爲,這是@ŞükrüHasdemir真正想要的。謝謝。 – alecxe

2

這裏發生的事情是,它定義了_index,但在__init__運行後丟失。你應該附加self的一切,所以它的self._index等。這適用於整個班級,而不僅僅是在__init__

相關問題