這很簡單真的,words
是類的實例包含nltk.corpus
,相關代碼名稱:
words = LazyCorpusLoader('words', WordListCorpusReader, r'(?!README|\.).*')
這一切的意思是,words
是一個實例LazyCorpusLoader
。
所以你得到nltk.corpus.words
作爲參考。
但是等等!
如果您查看LazyCorpusLoader
的代碼,它還會調用LazyCorpusLoader
和WordListCorpusReader
。
WordListCorpusReader
恰好有一個方法叫words
,它看起來像這樣:
def words(self, fileids=None):
return line_tokenize(self.raw(fileids))
而且LazyCorpusLoader
做到這一點corpus = self.__reader_cls(root, *self.__args, **self.__kwargs)
從本質上講,做的是使self.__reader__cls
的WordListCorpusReader
一個實例(它有自己的字法)。
那麼它這樣做:
self.__dict__ = corpus.__dict__
self.__class__ = corpus.__class__
根據Python文檔__dict__ is the module’s namespace as a dictionary object
。所以它將命名空間更改爲corpus
的命名空間。同樣,對於__class__
文檔說__class__ is the instance’s class
,所以它也改變了類。因此nltk.corpus.words.words
是指包含在名爲words
的實例中的實例方法字。那有意義嗎?此代碼說明了相同的行爲:
class Bar(object):
def foo(self):
return "I am a method of Bar"
class Foo(object):
def __init__(self, newcls):
newcls = newcls()
self.__class__ = newcls.__class__
self.__dict__ = newcls.__dict__
foo = Foo(Bar)
print foo.foo()
而且,這裏是鏈接到源,所以你可以看到自己:
http://nltk.googlecode.com/svn/trunk/doc/api/nltk.corpus-pysrc.html
http://nltk.googlecode.com/svn/trunk/doc/api/nltk.corpus.reader.wordlist-pysrc.html#WordListCorpusReader
來源
2013-05-31 06:44:08
Wes