__から始まるフィールド変数

アンダースコアを二つつける

同じくみんなのPythonによれば

より厳しくアトリビュートやメソッドへのアクセスを制限したい場合には、名前の前のアンダースコアを二つつけます。たとえば、クラスに「__size」という名前のアトリビュートを設定するとします。すると、クラスの外部からは「__size」という名前でこのアトリビュートにアクセスできなくなります。

Pythonのアクセス制限と抽象クラス&インターフェイスについてのまとめ – Seeking for my unique color.

試してみましたが、なんかおかしい。

class Tag:
__name = None
def getName(self):
return self.__name
class Html(Tag):
__name = 'html'
html = Html()
print html.getName()

Tagクラスを継承したHtmlクラスがあるとき、Htmlクラスのインスタンスを作って、TagクラスのメソッドgetNameを呼び出す。

勿論、’html’が表示されることを期待してるんだけど、’None’が表示される。なんじゃこりゃ???

class Tag:
name = None
def getName(self):
return self.name
class 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さん、ありがとうございました。

Leave a Comment

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.