首頁 >後端開發 >Python教學 >Python 的「私有」方法封裝是個神話嗎?

Python 的「私有」方法封裝是個神話嗎?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-12-05 19:16:11861瀏覽

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

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