0

次の単純なオブジェクトをテストしようとしています:

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

2 に答える 2

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)

クラスレベルの変数が使用されているため、2 番目の例は最初の例と同等ではないことに注意してください。以下のコメントを参照してください。

于 2013-07-13T21:04:42.803 に答える
2

ここで起こっていることは、それが定義されているが、実行_index後に失われるということ__init__です。selfすべてに追加する必要があるためself._index、 などです。これは、 だけでなく、クラス全体に当てはまり__init__ます。

于 2013-07-13T21:06:50.657 に答える