class test(object): def __init__(self, age, height): self.__age = age self.__height = height def print_(self): print self.__age i=Student(20,175)
對於這個直接print i.__age 是會提示報錯的,但是
i.__age=18 print __age #賦值和輸出,不會報錯,結果為18 i.print_age() #class內部方法輸出__age為20
按照道理來說1,2行是不該是這樣的,私有屬性是無法在外部訪問的,而在這里居然可以賦值后訪問。而第三行表明,對於實例 i ,有兩個(一個?)同名屬性,還不報錯?
后來百度了一下,以下全部復制於這里:http://www.pythonclub.org/python-class/private 有興趣可以看看,還有關於python的其他的內容
Python中默認的成員函數,成員變量都是公開的(public),而且python中沒有類似public,private等關鍵詞來修飾成員函數,成員變量。
在python中定義私有變量只需要在變量名或函數名前加上 ”__“兩個下划線,那么這個函數或變量就會為私有的了。
在內部,python使用一種 name mangling 技術,將 __membername替換成 _classname__membername,所以你在外部使用原來的私有成員的名字時,會提示找不到。
命名混淆意在給出一個在類中定義“私有”實例變量和方法的簡單途徑, 避免派生類的實例變量定義產生問題,或者與外界代碼中的變量搞混。 要注意的是混淆規則主要目的在於避免意外錯誤, 被認作為私有的變量仍然有可能被訪問或修改。 在特定的場合它也是有用的,比如調試的時候, 這也是一直沒有堵上這個漏洞的原因之一 (小漏洞:派生類和基類取相同的名字就可以使用基類的私有變量。)