為什麼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
如輸出所示,子類別成功覆寫__baz 的值,而不影響超類別的「私有」屬性。此外,存取 x.__dict__ 顯示 __baz 屬性的兩個版本在子類別實例中共存。
雖然此名稱加擾可能會阻止意外覆蓋,但它並不能阻止從外部來源有意存取「私有」方法。因此,Python 的「私有」方法並不是真正私有的,不應該依賴封裝。
以上是Python 的「私有」方法真的是私有的嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!