本当に簡単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)
基本的に、それが行うのは(独自のwordsメソッドを持つ)self.__reader__cls
のインスタンスを作成することです。WordListCorpusReader
次に、これを行います。
self.__dict__ = corpus.__dict__
self.__class__ = corpus.__class__
Python docs によると__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