web-dev-qa-db-ja.com

Pythonでは常にアンダースコア付きのプレフィックスプライベートメソッドを使用する必要がありますか?

メソッドとメンバーの前に下線を付けると、内部使用を示します。単純なクラスの場合、self.fooのインデントよりもself._fooの方が読みやすく入力しやすいことがあります。特に抽象インターフェースを実装する場合、このインターフェースはすでにかなり明確です。もちろん、クラスには、提供したいより多くのパブリックメンバーとメソッドを含めることができます。何かを公にアクセス可能にする必要がない場合は、常に先頭の下線を使用する必要がありますか?

1
danijar

Python docsの Classesセクション によると:

オブジェクトの内部以外からアクセスできない「プライベート」インスタンス変数は、Pythonには存在しません。ただし、ほとんどのPythonコード:アンダースコアが前に付けられた名前(_spamなど)が後に続く規則があります)は、APIの非公開部分として扱われる必要があります(それが関数、メソッド、またはデータメンバー)。実装の詳細と見なされ、予告なしに変更される場合があります。

クラスプライベートメンバーには有効なユースケースがあるため(つまり、サブクラスによって定義された名前と名前の名前の衝突を回避するため)、名前マングリングと呼ばれるこのようなメカニズムのサポートは制限されています。 __spam形式の識別子(少なくとも2つの先頭のアンダースコア、最大で1つの末尾のアンダースコア)は、テキストで_classname__spamに置き換えられます。ここで、classnameは、先頭のアンダースコアが削除された現在のクラス名です。このマングリングは、クラスの定義内で発生する限り、識別子の構文上の位置に関係なく実行されます。

_somethingは、somethingがAPIの一部ではなく、予告なしに変更できる、または今後変更される可能性があること、つまり内部/プライベートとして扱われるべきであることを他のユーザーに示します。

継承を使用している場合は、__somethingは、実装の詳細であることを示し、サブクラスとの名前の競合を回避するため、より良い選択です。

4
David Arno