2013-02-24 11 views
5

私は、Python 3.2で 'protected'アクセス権を持つクラス階層を設定したいと思います。基本クラスのメンバーは、派生クラスのスコープ内にありますが、 'public'ではありません。Pythonで「保護された」アクセス - どのように?

二重アンダースコアはメンバを「プライベート」にしますが、一意のアンダースコアは警告を示しますが、メンバは「パブリック」のままです。保護されたメンバーを指定するための正しい構文は何か(あれば...)です。

+6

できません。 '_single_underscore'の規約を使い、満足してください。 – JBernardo

答えて

8

Pythonのメンバーアクセス許可は、「交渉」と「条約」によって動作します。強制的にではありません。

言い換えれば、クラスのユーザーは自分のビジネスではないものから手を離すことになっていますが、私の_xxx識別子を使用する以外は、アクセスが(通常)適切ではないことを絶対に明示することはできません。

+0

だからできません。 OK。しかし、私は何度も声を出している「力」ではなく「条約」に問題があります。アクセス指定子の背後にあるアイディアは、他の人々が何かをやることを防ぐことではありません。それはあなたのコードの構造化された明確な組織についてです。私は自分の言葉が助けたいと思っています。あらゆる種類のクレイジーハックのためのオープニングを残さず、よく見かけるPythonコードで共通しています。 (おそらくPythonを使用してはならないことを示しています...) – Vector

3

二重アンダースコアは、C++やJavaの意味でメンバーを「プライベート」にしません。Pythonは、そのような種類の言語強制アクセス規則をかなり明白にしません。 A singleアンダースコアは、属性またはメソッドを「実装の詳細」としてマークします。つまり、外部のものはまだそれに到達できますが、これはクラスのインターフェイスでサポートされていない部分なので、クラスがインバリアントやバック/フォワードの互換性を保証しない可能性があります。これは、異なる方法で「私的」(インタフェースと実装の分離)と同じ概念上の問題を解決します。

ダブルはまだ「プライベート」ではありません名前の符号化を呼び出すアンダー - それは、上記のわずかに強い処方され、それによって: - この関数は、このクラスの実装の詳細で、しかし - サブクラスかもしれません合理的に元

のオーバーライドされたバージョンを意味するものではではないことを、同じ名前のメソッドを持つことを期待これは__nameは、クラスの名前が含まれるようにマングルさせ、言語サポートの少しを取ります - サブクラスのバージョンはオーバーライドする代わりに異なる名前を取得します。サブクラスまたは外部コードが本当に望むなら、そのメソッドを呼び出すことは可能であり、名前マングリングの目的は明示的にではなく、を避けることです。

しかしなぜなら、このすべて、「保護された」のPythonであまり意味がないことが判明 - あなた本当にはおそらくドン、現実的にサブクラス(と、によって呼び出されない限り不変量を破る可能性が方法を持っている場合たとえあなたがそうだと思っても)、Python Wayはそれを文書化するだけです。ドキュメントストリングに「これはサブクラスによってのみ呼び出されると想定されます」という注釈を付け、クライアントが正しいことをするという前提で実行します。そうでなければ、それ自体の問題になります。

+0

'二重のアンダースコアは、C++やJavaの意味で' private 'というメンバーを作成しません。だからこそ、「プライベート」は引用符で囲まれています。しかし、リフレッシュしてくれてありがとう。 – Vector

関連する問題