134

次の 2 つの部分で構成される小さな Python モジュールをコーディングしています。

  • パブリック インターフェイスを定義するいくつかの関数
  • 上記の関数で使用される実装クラスですが、モジュールの外では意味がありません。

最初は、この実装クラスを関数内で定義して「隠す」ことにしたのですが、これでは可読性が損なわれ、複数の関数が同じクラスを再利用すると使用できなくなります。

では、コメントとドキュメントストリングに加えて、クラスを「プライベート」または「内部」としてマークするメカニズムはありますか? 私はアンダースコアのメカニズムを認識していますが、私が理解しているように、それは変数、関数、およびメソッド名にのみ適用されます。

4

7 に答える 7

212

単一のアンダースコア プレフィックスを使用します。

class _Internal:
    ...

これは、「内部」シンボルに対する公式の Python 規則です。「from module import *」は、アンダースコアで始まるオブジェクトをインポートしません。

単一アンダースコア規則への参照。

于 2009-02-15T15:34:03.643 に答える
85

要するに:

  1. プライバシーを強制することはできません。Pythonにはプライベートクラス/メソッド/関数はありません。少なくとも、Javaなどの他の言語のように厳密なプライバシーはありません。

  2. プライバシーを示す/提案することしかできません。これは慣例に従います。クラス/関数/メソッドをプライベートとしてマークするためのPythonの規則は、その前に_(アンダースコア)を付けることです。たとえば、def _myfunc()またはclass _MyClass:。メソッドの前に2つのアンダースコアを付けることで、疑似プライバシーを作成することもできます(たとえば__foo)。メソッドに直接アクセスすることはできませんが、クラス名(たとえば_classname__foo)を使用して特別なプレフィックスを介してメソッドを呼び出すことはできます。したがって、あなたができる最善のことは、プライバシーを強制するのではなく、プライバシーを示す/提案することです。

Pythonはこの点でPerlに似ています。Perlの本からプライバシーについての有名な言葉を言い換えると、哲学は、ショットガンで守られているからではなく、招待されていないからリビングルームに立ち入らないようにすることです。

詳細については:

于 2009-02-15T18:31:49.783 に答える
44

エクスポートする名前のリストを定義__all__します (ドキュメントを参照してください)。

__all__ = ['public_class'] # don't add here the 'implementation_class'
于 2009-02-15T15:36:03.030 に答える
16

私が時々使用するパターンはこれです:

クラスを定義します。

class x(object):
    def doThis(self):
        ...
    def doThat(self):
        ...

クラス名を上書きして、クラスのインスタンスを作成します。

x = x()

機能を公開するシンボルを定義します。

doThis = x.doThis
doThat = x.doThat

インスタンス自体を削除します。

del x

これで、パブリック関数のみを公開するモジュールができました。

于 2009-02-15T15:58:49.027 に答える
11

規則では、内部クラス、関数、および変数の先頭に「_」を追加します。

于 2009-02-15T15:33:48.260 に答える
6

「プライベート」識別子の名前のプレフィックスには、2つのアンダースコアを使用します。モジュール内のクラスの場合、先頭に1つのアンダースコアを使用すると、「frommoduleimport*」を使用してインポートされません。

class _MyInternalClass:
    def __my_private_method:
        pass

(Pythonには、真の「プライベート」というものはありません。たとえば、Pythonは、二重アンダースコアを使用してクラスメンバーの名前を自動的にマングルします。したがって、マングルされた名前__clssname_mymemberがわかっている場合は、とにかく「プライベート」エンティティを使用できます。 。ここを参照してください。もちろん、必要に応じて「内部」クラスを手動でインポートすることもできます)。

于 2009-02-15T16:37:01.340 に答える
5

設計規則の問題に対処するために、そしてchroderが言ったように、Pythonには「プライベート」のようなものは実際にはありません。これは、C / C ++のバックグラウンドから来た人(しばらく前の私のように)にとってはねじれたように聞こえるかもしれませんが、最終的には、次の規則で十分であることに気付くでしょう。

アンダースコアが前に付いているものを見ると、それを直接使用しないための十分なヒントになるはずです。雑然とした出力(クラスの使用方法を検索するときに誰もが見るもの)が気になる場合はhelp(MyClass)、下線付きの属性/クラスがそこに含まれていないため、「パブリック」インターフェイスが記述されているだけになります。

さらに、すべてを公開することには、たとえば、外部からほとんどすべてのものを単体テストできるなど、独自のすばらしい特典があります(C / C ++プライベート構造では実際には実行できません)。

于 2009-02-15T18:09:59.727 に答える