ホームページ >バックエンド開発 >Python チュートリアル >Python の「プライベート」メソッドのカプセル化は神話ですか?

Python の「プライベート」メソッドのカプセル化は神話ですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-05 19:16:11863ブラウズ

Is Python's

Python の 'プライベート' メソッド: カプセル化の神話を明らかにする

その名前に反して、Python の 'プライベート' メソッドは完全にプライベートではありません。メソッド名の前に二重アンダースコアを付けると (例: __myPrivateMethod())、プライバシーのような錯覚が生じますが、Python は名前を変更して動的に生成されたメソッドを通じてこれらのメソッドを公開します。

次のコードを考えてみましょう:

class MyClass:
    def myPublicMethod(self):
        print('public method')

    def __myPrivateMethod(self):
        print('this is private!!')

obj = MyClass()

obj.myPublicMethod() を呼び出すと、パブリック メソッドが正常に呼び出されます。ただし、obj.__myPrivateMethod() を呼び出そうとすると、AttributeError が発生します。

dir(obj) で問題を深く掘り下げると、新しいメソッドが明らかになります。

dir(obj)
# Output: ['_MyClass__myPrivateMethod', '__doc__', '__module__', 'myPublicMethod']

これは動的に生成されます。 _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)

x = Bar()
x.foo()  # Output: 42
x.bar()  # Output: 21
print(x.__dict__)
# Output: {'_Bar__baz': 21, '_Foo__baz': 42}

サブクラスは、変更された名前を通じて、オーバーライドされたプライベート属性またはメソッドに引き続きアクセスできます。

要約すると、Python の「プライベート」メソッドは、実際にはプライベートではありません。オブジェクト指向プログラミングの原則の感覚。これらは偶発的なオーバーライドを防ぐためのメカニズムにすぎませんが、意図的な外部アクセスに対する保護は提供されません。

以上がPython の「プライベート」メソッドのカプセル化は神話ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。