Python の「プライベート」メソッド: 見た目ほど難攻不落ではない
Python の「プライベート」メソッドが強力なカプセル化を提供するという誤解にもかかわらず、詳しく調べると、それらは真にプライベートなものではないことがわかります。メソッドの前に二重アンダースコアを付ける (__myPrivateMethod()) とプライベート スコープを示唆しますが、実際には名前が変更されたメソッドが作成されます。
たとえば、次のクラスはこの動作を示しています。
class MyClass: def myPublicMethod(self): print('public method') def __myPrivateMethod(self): print('this is private!!')
このクラスのオブジェクトをインスタンス化するとき、プライベート オブジェクトにアクセスできないことが予想されます。 method:
obj = MyClass() obj.myPublicMethod()
ただし、後続の dir(obj) 呼び出しにより、魔法のように作成されたメソッドの存在が明らかになります:
dir(obj) ['_MyClass__myPrivateMethod', '__doc__', '__module__', 'myPublicMethod']
このメソッドを呼び出すと、「プライベート」データが明らかになります:
obj._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() # 42 x.bar() # 21 print(x.__dict__) # {'_Bar__baz': 21, '_Foo__baz': 42}
結論として、Python の「プライベート」メソッドは真のプライベートではなく、サブクラスからのアクセスを許可します。この設計上の選択では、厳密なカプセル化よりもサブクラス化の柔軟性が優先されますが、コードの整合性を維持するために開発者は注意して使用する必要もあります。
以上がPython の「プライベート」メソッドは実際どのくらいプライベートですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。