首頁 >後端開發 >Python教學 >Python 的「私有」方法真的是私有的嗎?

Python 的「私有」方法真的是私有的嗎?

Barbara Streisand
Barbara Streisand原創
2024-12-02 22:33:11461瀏覽

Are Python's

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

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn