Python 的「私有」方法:不像看起來那麼難以理解
儘管人們誤以為Python 的「私有」方法提供了強大的封裝性,但仔細檢查就會發現它們並不是真正的私有。雖然在方法前面加入雙底線 (__myPrivateMethod()) 表示私有作用域,但它實際上建立了一個具有修改名稱的方法。
例如,以下類別示範了此行為:
class MyClass: def myPublicMethod(self): print('public method') def __myPrivateMethod(self): print('this is private!!')
當實例化此類別的物件時,人們會期望無法存取私有的方法:
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中文網其他相關文章!