Python中類的屬性的訪問控制


  因為自己是做.NET的,之前有學習過Python,喜歡這門語言的很多特性,最近又不時看了一會兒,將自己的感受分享給大家,其中也難免會用C#的角度看Python的語法,主要還是講下Python中類中對屬性的訪問。

  講到屬性訪問,都能想到公有,私有,受保護,C#的方法是public private protected,Python中也真心讓自己感覺到難以理解。

  首先定義一個類(博客園對python代碼沒着色,大家看圖吧)

  

  就個人認識,不一定對,覺得Python是一門動態的語言,很多屬性都是動態加上去,如name屬性,當調用到這個setName方法時,Room類的實例才會擁有name屬性,就像圖中一樣,如果在setName調用后,沒有去調用setSize,而在display方法中又使用到了size屬性,則程序報錯,這里個人把這種屬性當公開的吧,因為類的實例確實能訪問到。

  再來張圖

  

  如上圖中的name和location屬性,在構造函數__init__中傳入,給這兩個屬性賦值,注意這個self,其實到現在我出說不清name和location是什么屬性了,它們即可以是實例屬性,也可以是類屬性,使用變量nb和sz可以訪問到,使用類名City也可以方法到,只不過用類名訪問到的是空的字符串。如果改一些的話

  

  在setRegion方法中,使用City.來找到region並給它賦值,那為什么使用nb和sz也能找到這個region,而且值是一樣的呢,是不是有點像C#靜態屬性,是使用類名訪問的,但在Python中又可以使用實例來訪問,這是因為類和實例都有各自的一個作用域,當要在實例作用域上找一個屬性時,如果找不到,則用向上去類作用域中找。自然,可以想象在City類中,name,location,region屬於類作用域,但在實例作用域中出存在name和location屬性。

  可以簡單地說,類作用域中的屬性是所有實例都能訪問到,而且修改后,其它實例也會影響,但究其原因是實例作用域找不到,找到了類作用域。

  現在靜態語言中的那一套真心不適用了,但引用作用域后,對Python的訪問行為多少還是了解了點。

  那來說說下私有唄

  

  使用兩個下划線來表示這是一個私有的屬性,私有屬性也涵蓋類的私有屬性和實例的私有屬性,執行最后兩個print語句時,程序報錯。書中也講到私有屬性其實也是可以被訪問到,Python解釋器使用改屬性名稱來阻止實例去訪問那些屬性。


免責聲明!

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



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