開發者學堂課程【Python 語言基礎 3:函數、面向對象、異常處理:隐藏類中的屬性】學習筆記,與課程緊密聯系,讓使用者快速學習知識。
課程位址:
https://developer.aliyun.com/learning/course/601/detail/8748隐藏類中的屬性
目錄:
一、封裝的優點
二、隐藏屬性
封裝的優點,由于它在以下代碼裡有些地方是無法展現的,是以現在講它的第二個優點。
class Dog:
…
表示狗的分類
def_init_ (self , name , age):
self. hidden_ name = name
self.hidden_ age = age
def say_ hello(self):
print(‘大家好,我是%s "%seIf. hidden_ name )
def get_ name(self):
…
get_name( )用來擷取對象的name屬性
首先,先建立一個新的檔案,以封裝命名,它的第二個優點仍然圍繞我們的 getter方法和 setter 方法,使用 setter 方法設定屬性,可以增加資料的驗證,確定資料的值是正确的。使用 getter 方法擷取屬性,可以使用 setter 方法設定屬性。在某些情況下我們會建立一些特殊類
class Rectangle :
…
表示矩形的類
def_init_ (self , width,height):
self. hidden_ width = width
self. hidden_ height = height
def get_width(self):
retern self. hidden_ width
def get_height(self):
return self. hidden_ height
def set_width(self , width):
self. hidden_ width = width
def set_ height(self , height):
self. hidden_ height = height
矩形裡面有個面積公式,因為已經設定了它的長度和寬度,是以它的面積是不需要設定的直接就能得出來,此時若需要知道它的面積,隻需要在代碼後面加上
def set_areg(self):
return self.hidden_width * self.hidden_height
即可得出面積
設定長度和寬度
r = Rectangle(5,2)
print(r.get_area())
運作結果顯示為在長為 5 寬為 2 的矩形裡,面積為 10
由此可以看出它的另一個優點為:使用 getter 方法可以表示一些計算的屬性
class Person:
def_init_ (self ,name):
self. hidden_ name = name
def get_ name(self) :
return self. hidden_ name
def set_ name(self , name) :
self. hidden_ name = name
p = Person(‘孫悟空’)
print(p.get_name())
現在這種隐藏屬性的封裝方式主要就是在屬性前面加上 hidden,外部依然可以通路,但在某些情況下我們不希望外部可以通路,那就可以為對象的屬性使用雙下劃線開頭,_xxx 後面跟屬性。雙下劃線開頭的屬性,是對象的隐藏屬性,隐藏屬性隻能在類的内部,無法通過對象通路。
class Person:
def __init__ (self , name):
self.__name = name
def get_ name(self):
return self.__name
def set_ name(self , name) :
self.__name = name
p = Person(‘孫悟空’)
print(p.__name)
print(p.get_ name( ))
因為雙下頭線的開頭屬性是隐藏屬性,無法通過對象通路
隐藏屬性隻不過是 Python 自動為屬性改了名字。實際上是将名字修改為了,_類名_屬性名 比如
__name -> _Person__name
class Person:
def __init__ (self , name):
self.__name = name
def get_ name(self):
return self.__name
def set_ name(self , name) :
self.__name = name
p = Person(‘孫悟空’)
print(p.__Person__name)
p._Person__name = ‘豬八戒’
print(p.get_ name( ))
同理 給函數加雙下劃線也是一樣的,使用__開頭的屬性,實際上依然可以外部通路,是以這種方式我們一般不用,一般我們會将一些私有屬性(不希望被外部通路的屬性)以_開頭。
一般情況下使用_開頭的屬性都是私有屬性,沒有特殊需要不要修改私有屬性。