クラスのカプセル化

 カプセル化とは、簡単にいうとプライバシーの問題です。クラスはアトリビュートを持ちますが、プログラミング中に外部で使っていいものと、クラス内部での処理に使うものがあります。その区別をクラス設計時につけて、アトリビュートを外部から使えなくすることをカプセル化と言います。

 アトリビュートやメゾットを隠す

アトリビュート名の先頭にアンダースコア(_)を一つつける
 これは簡単に言えば習慣です。なんの効力もありません。クラスを使おうとする人がこれは外部から使うことを想定せずに作られたアトリビュート(メゾット)だから勝手に使うのは良くないと気づくための暗黙の記号、つまり紳士協定です。

アトリビュート名の先頭にアンダースコア(_)を二つつける
 そんなこと言ったってどうしても触ってしまって欲しくない、もしくは間違って触られると大変なことになってしまうといったアトリビュートにはアンダースコアを二つつけます。こうすることでクラスの外部からのアトリビュートやメゾットを使うことが出来なくなります。

 今回はわざとエラーを起こすのでインタラクティブシェルを使います。入力することはスクリプトファイルでやっていることと同じです。ちょっとインデックスの入力で戸惑うかもしれませんが、トライしてみて下さい。


 >>> class Obj(object):
 ...    variable = "abc"
 ...    _variable = "def"
 ...    __variable = "ghi"
 ...
 >>> o = Obj()
 >>> o.variable
 'abc'
 >>> o._variable
 'def'
 >>> o.__variable ←アンダースコア2つのアトリビュートは見せてもらえない。
 Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
 AttributeError: 'obj' object has no attribute '__variable'
 >>>