__から始まるフィールド変数
2008/04/11
アンダースコアを二つつける
同じくみんなのPythonによれば
Pythonのアクセス制限と抽象クラス&インターフェイスについてのまとめ – Seeking for my unique color.より厳しくアトリビュートやメソッドへのアクセスを制限したい場合には、名前の前のアンダースコアを二つつけます。たとえば、クラスに「__size」という名前のアトリビュートを設定するとします。すると、クラスの外部からは「__size」という名前でこのアトリビュートにアクセスできなくなります。
試してみましたが、なんかおかしい。
class Tag: __name = Nonedef getName(self):return self.__nameclass Html(Tag): __name = 'html' html = Html()print html.getName()
Tagクラスを継承したHtmlクラスがあるとき、Htmlクラスのインスタンスを作って、TagクラスのメソッドgetNameを呼び出す。
勿論、’html’が表示されることを期待してるんだけど、’None’が表示される。なんじゃこりゃ???
class Tag: name = Nonedef getName(self):return self.nameclass Html(Tag): name = 'html' html = Html()print html.getName()
__name を name に変えたら、’html’ が表示された。
__ から始まる変数は、使えないってことかな。それともcygwin python2.5.1って変?
追記 20080421
pokarim さんにトラックバックもらって、__から始まる変数まわりを、再考してみました。
http://d.hatena.ne.jp/pokarim/20080419/1208624326
pokarimさんのコードを実行しながら、なんとかわかってきました。
わかってなかった点
- まず第一に、クラス変数とフィールド変数を、明確に理解してなかった。でも、クラス変数もフィールド変数もself.field_nameでアクセスするから混乱してた。
- __から始まるフィールド変数は、_(クラス名)が付けられるから、サブクラスからもアクセスできないようになる。javaで言うところのプライベート変数かな?
- 普通のフィールド変数(上の例では、name)が、サブクラスからアクセスできていたのは、protectedなわけではなく、要するにpublicだから。
フィールド変数、クラス変数という呼び名もpython的に正しいかわからない。pythonのOOPは、今の自分にとっては、いろいろと特殊に感じるので、触りながら、なんとなくわかるようなものじゃないみたい。ちゃんと理解するためには、覚えることが多いのかもしれません。
pokarimさん、ありがとうございました。