python類私有屬性的坑-真假的私有屬性


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,所以你在外部使用原來的私有成員的名字時,會提示找不到。

命名混淆意在給出一個在類中定義“私有”實例變量和方法的簡單途徑, 避免派生類的實例變量定義產生問題,或者與外界代碼中的變量搞混。 要注意的是混淆規則主要目的在於避免意外錯誤, 被認作為私有的變量仍然有可能被訪問或修改。 在特定的場合它也是有用的,比如調試的時候, 這也是一直沒有堵上這個漏洞的原因之一 (小漏洞:派生類和基類取相同的名字就可以使用基類的私有變量。)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM