Commits

Naoki INADA committed ba9fe85

private

Comments (0)

Files changed (1)

     <__main__.Bar object at ...>
     >>> bar.bar()        # インスタンス属性として呼び出してもクラスが束縛される.
     <__main__.Bar object at ...>
+
+
+プライベート
+-------------
+
+Python にはプライベートはありません。
+慣習として、アンダースコアで始まる属性やメソッドはプライベートだということになっています。
+
+また、クラスを継承して、たまたま同じ属性名がぶつかってしまうのを防ぐために、 class 文の中で
+``__`` で始まる名前 (ただし ``__init__`` みたいに ``__`` で終わる名前は除く) を使うと、
+自動的に ``__<クラス名>_<元の名前>`` という形の名前に変換されます。
+
+ただし、プライベートな属性やメソッドだってテストしたいことがありますし、
+テスト中にプライベートメソッドをモックを返すダミー関数に置き換えたい場合もあります。
+
+なので、 ``__`` を使うよりも、クラスを小さくしたり継承を使い過ぎないようにして
+たまたま継承したクラスで想定外のメソッドや属性を上書きしてしまうミスを防ぐことをお勧めします。