まず参考サイトから。
大変参考になりました。これらの記事を書かれた皆さん、ありがとうございます。
なんというか・・・非常に簡潔な作り。C++とかJavaというよりは、JavaScriptとかPerlに近い。個人的な感覚ではPerlに似てるなぁ、と思う。Perlはリファレンスに対してパッケージでblessするという書いててもよく分からないんだけどとにかくそんなことをしてるんだけど、Pythonの場合は名前空間に対してClass名をbindするという感じで、多少の階層や概念の齟齬はあれど感覚的にはよく似てると思った。
だから、逆に言えば隠蔽機能は皆無に近いみたい。やろうとするとPerlと同じ感じで、特殊メソッドを使ってかなりガリガリマジックを駆使する必要が有るっぽい。簡潔な作りは簡潔に利用する方がいい気がする。せっかく覚えることを減らしてくれてるんだから。
Pythonドキュメントで言えば、Win版2.5でのCHMヘルプの章立てで示すと以下の辺りが参考になる。
あと、結局 __init__() とかインスタンスメソッドの第一引数で使う"self"という奴、予約語というわけじゃないのだから、"this"とかにしてもOKじゃね?と思ったら本当にOKだった。
>>> class C1(object): ... v1 = 'abc' ... def m1(this): print "Hello, " + this.v1 ... >>> o1 = C1() >>> o1.m1() Hello, abc
ちなみに以下のような実験で、どうやらインスタンス生成ではクラスオブジェクトの名前空間(__dict__)がコピーされてインスタンスの名前空間に引き継がれているようではあるが、未調査なので何とも言えない。
>>> class C1(object): ... v1 = 'abc' ... def m1(self): print 'Hello, ', self.v1 ... >>> o1 = C1() >>> o1.m1() Hello, abc >>> o1.v1 = 'ABC' >>> C1.v1 'abc' >>> o1.m1() Hello, ABC >>> o2 = C1() >>> o2.m1() Hello, abc >>> C1.v1 = 'DEF' >>> o3 = C1() >>> o3.m1() Hello, DEF >>> o1.m1() Hello, ABC
o1オブジェクトのv1属性を書き換えても、C1(クラス)オブジェクトのv1属性は変わっていない。このため、o2で新たにインスタンスを生成しても、最初の"abc"が引き継がれている。一方、C1オブジェクト側でv1属性を変更した後o3でインスタンスを生成すると、変更された値が引き継がれている。当然、o1のv1属性は先に変更した値のままである。