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中文網其他相關文章!