「保護された」アクセスを使用して Python 3.2 でクラス階層を設定したいと思います。基本クラスのメンバーは、派生クラスのスコープにのみ含まれますが、「パブリック」には含まれません。
2 つのアンダースコアはメンバーを「プライベート」にし、1 つのアンダースコアは警告を示しますが、メンバーは「パブリック」のままです。「保護された」メンバーを指定するための正しい構文は何ですか (もしあれば...)。
「保護された」アクセスを使用して Python 3.2 でクラス階層を設定したいと思います。基本クラスのメンバーは、派生クラスのスコープにのみ含まれますが、「パブリック」には含まれません。
2 つのアンダースコアはメンバーを「プライベート」にし、1 つのアンダースコアは警告を示しますが、メンバーは「パブリック」のままです。「保護された」メンバーを指定するための正しい構文は何ですか (もしあれば...)。
Python でのメンバー アクセス許可は、強制ではなく、「交渉」と「条約」によって機能します。
言い換えれば、あなたのクラスのユーザーは、彼らのビジネスではないものから手を離すことになっていますが、私が_xxx
識別子を使用する以外にそれを強制することはできません。
2 つのアンダースコアは、C++ や Java の意味でメンバーを「プライベート」にはしません。Python は、その種の言語強制アクセス ルールを明確に避けています。慣例により、単一のアンダースコアは、属性またはメソッドを「実装の詳細」としてマークします。つまり、外部のものは引き続きそれにアクセスできますが、これはクラスのインターフェイスのサポートされている部分ではないため、保証クラスが不変条件または前後の互換性について作成する可能性があることは、もはや適用されません。これにより、「プライベート」と同じ概念上の問題 (インターフェースと実装の分離) が別の方法で解決されます。
2 つのアンダースコアは、まだ「プライベート」ではない名前マングリングを呼び出します。これは、上記の定式化をわずかに強化したものであり、次のようになります。 - この関数は、このクラスの実装の詳細ですが、 - サブクラスは、オリジナルのオーバーライドされたバージョンとして意図されていない同じ名前
これには言語サポートが少し必要です。これにより、__name
はクラスの名前を含むようにマングルされます。そのため、クラスのサブクラス バージョンは、オーバーライドする代わりに別の名前を取得します。サブクラスまたは外部コードが本当に必要な場合は、そのメソッドを呼び出す可能性は依然として十分にあります。名前マングリングの目的は、明示的にそれを妨げないことです。
しかし、これらすべてのことから、Python では「保護」はあまり意味をなさないことがわかります。サブクラスによって呼び出されない限り、不変条件を破る可能性のあるメソッドが実際にある場合(そして、現実的には、そう思っていてもおそらくそうではないでしょう)。 )、Python Way はそれを文書化するためのものです。「これはサブクラスによってのみ呼び出されると想定されています」という趣旨のメモをドキュメント文字列に入れ、クライアントが正しいことを行うという前提で実行します-そうでない場合、それは独自の問題になるためです。