ホームページ >バックエンド開発 >Python チュートリアル >Python の「プライベート」メソッドは本当にプライベートですか?
Python の 'プライベート' メソッドが実際にはプライベートではない理由
Python では 'プライベート' メソッドを示すために一般的に二重アンダースコア接頭辞が使用されますが、これらのメソッドは、わずかに異なる命名規則を通じてユーザーが引き続きアクセスできます。
Python インタープリターは、これらの「プライベート」メソッドの名前を「_ClassName__MethodName」に変更します。したがって、「プライベート」メソッドと称する「__myPrivateMethod()」は、「_MyClass__myPrivateMethod()」として呼び出すことができます。
この名前のスクランブルは、カプセル化の形式として、または外部アクセスを防止することを目的としたものではありません。代わりに、サブクラスがスーパークラスの「プライベート」メソッドを意図せずにオーバーライドしないようにするために機能します。
次の例を考えてみましょう。
class Foo(object): def __init__(self): self.__baz = 42 def foo(self): print(self.__baz) class Bar(Foo): def __init__(self): super(Bar, self).__init__() self.__baz = 21 def bar(self): print(self.__baz)
Bar のインスタンスを作成し、呼び出したときfoo() と bar() の両方で、次の出力が表示されます。
x = Bar() x.foo() 42 x.bar() 21
出力からわかるように、サブクラスは、スーパークラスの「private」属性に影響を与えることなく、__baz の値を正常にオーバーライドします。さらに、x.__dict__ にアクセスすると、両方のバージョンの __baz 属性がサブクラス インスタンス内に共存していることがわかります。
この名前のスクランブルは偶発的なオーバーライドを阻止する可能性がありますが、外部ソースからの「プライベート」メソッドへの意図的なアクセスを防ぐことはできません。したがって、Python の「プライベート」メソッドは真のプライベートではないため、カプセル化に依存すべきではありません。
以上がPython の「プライベート」メソッドは本当にプライベートですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。