質問: Pythonでは、privateな変数やメソッドの名前には _(アンダースコア)を慣習的につけるが本当はアクセスできる。 __(アンダースコア×2)の場合は本当にアクセスできなくなる(特殊な指定方法を使えばアクセス可能) という話を聞きました。 質問1. でもこれってどう使い分けるのでしょうか。 そもそもprivateな変数やメソッドでも慣習的にアンダースコアを使ってない場合も多いですよね。 質問2. アンダースコア、普段使ってますか?使う利点はありますか?
回答: Pythonの標準コーディングスタイルを定めるPEP 8にてガイドラインが説明されています。以下、日本語訳バージョンから部分引用します: 実践されている命名方法 > > `_single_leading_underscore`: “内部でだけ使う” ことを示します。たとえば`from M import *`は、アンダースコアで始まる名前のオブジェクトをインポートしません。 > > `__double_leading_underscore`: クラスの属性に名前を付けるときに、名前のマングリング機構を呼び出します (クラス`Foobar`の`__boo`という名前は`_FooBar__boo`になります。以下も参照してください) > > > メソッド名とインスタンス変数 > > 公開されていないメソッドやインスタンス変数にだけ、アンダースコアを先頭に付けてください。 > > サブクラスと名前が衝突した場合は、Pythonのマングリング機構を呼び出すためにアンダースコアを先頭に二つ付けてください。 > > > 継承の設計 > > * 公開されている(public)属性の先頭にはアンダースコアを付けない > > * もしあなたが公開している属性の名前が予約語と衝突する場合は、属性の名前の直後にアンダースコアを追加します。省略語を使ったり、スペルミスをするよりはマシです。 > > * サブクラス化して使うクラスがあるとします。サブクラスで使って欲しくない属性があった場合、その名前の最後ではなく、先頭にアンダースコアを二つ付けることを検討してみましょう。これによって Python のマングリングアルゴリズムが呼び出され、その属性にはクラス名が付加されます。これはサブクラスにうっかり同名の属性が入ってしまうことによる属性の衝突を避けるのに役立ちます。 > > >