1

私は、プライベート変数/メンバー/関数/へのPythonのアプローチの内外のほとんどを知っています...

しかし、外部利用のメソッドとサブクラス利用のメソッドをどう区別するかが決まらない。

次の例を検討してください。

class EventMixin(object):
    def subscribe(self, **kwargs):
        '''kwargs should be a dict of event -> callable, to be specialized in the subclass'''

    def event(self, name, *args, **kwargs):
        ...

    def _somePrivateMethod(self):
        ...

この例では、subscribe はクラス/オブジェクトの外部ユーザーが使用するメソッドであり、event は外部からではなく、サブクラスの実装によって呼び出されるべきメソッドであることを明確にしたいと思います。

現時点では、パブリック API の両方の部分を考慮しているため、アンダースコアは使用しません。ただし、この特定の状況では、たとえば、外部 API にはアンダースコアを使用せず、サブクラス化可能な API には 1 つのアンダースコアを使用し、プライベート/内部 API には 2 つのアンダースコアを使用する方がクリーンに感じられます。ただし、内部 API を次のように呼び出す必要があるため、扱いにくくなります。

self._EventMixin__somePrivateMethod()

では、コーディング、ドキュメント、またはその他の規則は何ですか?

4

3 に答える 3

3
use no underscores for the external API,
one underscore for the subclassable API,
and two underscores for the private/internal API

これは合理的で比較的一般的な方法です。(C++ 用語で「保護された」とは対照的に) 二重下線を実際に非公開にすることは、実際には非常にまれです。サブクラスがどの動作をオーバーライドしたいのか、実際にはわからないため、メンバーをいじることが特に危険である可能性があるという本当に正当な理由がない限り、「保護されている」と仮定することは一般的に良い賭けです。

However, that would become unwieldy because then the internal API would
need to be invoked as self._EventMixin__somePrivateMethod()

いいえ、二重下線付きのバージョンを使用するだけで、自動的に変更されます。醜いですが、うまくいきます。

于 2008-10-25T13:26:57.710 に答える
2

このような区別に遭遇した場合は、継承の代わりに構成を使用することを検討することをお勧めします。つまり、EventMixin継承するのではなく、インスタンス化(おそらく名前が変更される)します。

于 2008-10-26T12:48:00.323 に答える
2

一般に、ダブル __ を使用すると、単体テストが非常に苦痛になるため、価値があるよりも問題が多いことがわかります。特定のクラス/モジュールのパブリック インターフェイスの一部になることを意図していないメソッド/属性の規則として単一の _ を使用することは、私の推奨するアプローチです。

于 2008-10-25T15:45:28.280 に答える