天天看點

隐藏類中的屬性|學習筆記

開發者學堂課程【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( ))

同理 給函數加雙下劃線也是一樣的,使用__開頭的屬性,實際上依然可以外部通路,是以這種方式我們一般不用,一般我們會将一些私有屬性(不希望被外部通路的屬性)以_開頭。

一般情況下使用_開頭的屬性都是私有屬性,沒有特殊需要不要修改私有屬性。