Python中類的屬性的訪問控制

2021-07-04 15:21:11 字數 1382 閱讀 8860

因為自己是做.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直譯器使用改屬性名稱來阻止例項去訪問那些屬性。

Python中類的屬性的訪問控制

因為自己是做.net的,之前有學習過python,喜歡這門語言的很多特性,最近又不時看了一會兒,將自己的感受分享給大家,其中也難免會用c 的角度看python的語法,主要還是講下python中類中對屬性的訪問。講到屬性訪問,都能想到公有,私有,受保護,c 的方法是public private pro...

Python中類的屬性的訪問控制

因為自己是做.net的,之前有學習過python,喜歡這門語言的很多特性,最近又不時看了一會兒,將自己的感受分享給大家,其中也難免會用c 的角度看python的語法,主要還是講下python中類中對屬性的訪問。講到屬性訪問,都能想到公有,私有,受保護,c 的方法是public private pro...

Python中類的屬性的訪問控制

因為自己是做.net的,之前有學習過python,喜歡這門語言的很多特性,最近又不時看了一會兒,將自己的感受分享給大家,其中也難免會用c 的角度看python的語法,主要還是講下python中類中對屬性的訪問。講到屬性訪問,都能想到公有,私有,受保護,c 的方法是public private pro...