我正在尝试测试以下简单对象:
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'。我不明白这一点,__init__
中明确定义了_index!这里我的错误是什么?
帮助赞赏。
答案 0 :(得分: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)
注意,第二个示例与第一个示例不同,因为使用了类级变量,请参阅下面的注释。
答案 1 :(得分:2)
这里发生的是它定义_index
但在运行__init__
后丢失它。您应该将self
附加到所有内容,因此它是self._index
等。这适用于整个班级,而不仅仅是__init__
。