2017-02-12 112 views

回答

2

每當class裏面寫代碼使用兩個下劃線開始,但不也有兩個結尾的名稱強調了編譯器替換名稱以錯位的形式,其中包括類名:

>>> class Foo(object): 
    __bar = None 
    def set_bar(self, v): 
     self.__bar = v 


>>> f = Foo() 
>>> f.set_bar(42) 
>>> f.__dict__ 
{'_Foo__bar': 42} 

實際上這意味着當你創建子類時(假設子類的名稱與基類不同),你不會意外地與基類中使用的私有名稱相沖突。

它不是一個安全機制,因爲您仍然可以使用getattr獲得'私有'值,甚至只是名稱的破壞形式,並且它不是完美的保護,因爲有時類層次結構既有基本具有相同名稱的派生類。

+0

你實際上可以直接用'f._Foo_bar'獲得它☺ – zmo

+1

@zmo,是的,你可以。爲什麼我從來沒有想過這件事?添加到我的答案。 – Duncan

相關問題