2013-07-13 4 views
0

나는 다음과 같은 간단한 개체를 테스트하기 위해 노력하고있어 정의되지파이썬 전역 이름은

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__에 명확하게 정의되어있다. 여기 내 실수는 무엇입니까? 감사합니다. (나는 또한 lookup 방법을 단순화했습니다) 코드를 단순화하고이 같은 변수를 설정할 수 있습니다

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 

또는 :

답변

4

클래스 메서드에서 클래스 변수를 설정하기 위해, 당신은 self을 사용해야합니다

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__이 아닌 전체 클래스에 적용됩니다.