90

Pythonモジュールとその関数を作成するとき、部外者に公開されることになっている「パブリック」関数がいくつかありますが、ローカルおよび内部でのみ表示および使用されることになっている他の「プライベート」関数があります。

私はPythonには絶対的なプライベート関数がないことを理解しています。しかし、「パブリック」機能と「プライベート」機能を区別するための最良の、最もきちんとした、または最も使用されているスタイルは何ですか?

私が知っているスタイルのいくつかをリストします:

  1. モジュールファイルで使用__all__して、その「パブリック」関数を示します(python __all__モジュールレベル変数は何のためにありますか?
  2. 「プライベート」関数の名前の先頭にアンダースコアを使用する

人々が使用する他のアイデアや慣習はありますか?

どうもありがとうございます!

4

1 に答える 1

121

Pythonのクラスモジュールドキュメントから:

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

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

于 2013-02-25T17:03:22.417 に答える