更新時間:2022-08-03 來源:黑馬程序員 瀏覽量:
通常把隱藏屬性、方法與方法實現(xiàn)細節(jié)的過程稱為封裝。為了保護類里面的屬性,避免外界隨意賦值,可以采用如下方式解決:
·把屬性定義為私有屬性,即在屬性名的前面加上兩個下劃線。
·添加可以供外界調用的兩個方法,分別用于設置或者獲取屬性值。
在介紹封裝之前,我們先來看一段示例代碼,具體如下:
class Person: # 定義一個類 def __init__(self, name, age): # 構造方法 self.name = name # 姓名 self.age = age # 年齡 person = Person("老王", 30) # 創(chuàng)建一個對象 person.age = 300 print(person.age)
在上述示例中,定義了一個Person類,該類中有name(姓名)和age(年齡)兩個屬性。使用Person類的構造方法創(chuàng)建一個對象,并設置nage和age的初始值為“老王”和“30”,接著動態(tài)地設置age的值為300.從現(xiàn)實生活角度來看,這個年齡的設置是不符合邏輯的。
下面采用封裝的方式,對上述代碼進行修改,具體如例12-1所示。
例12-1 私有屬性.py
class Person: # 定義一個類 def __init__(self, name, age): # 構造方法 self.name = name # 姓名 self.age = age # 年齡 # 給私有屬性賦值 def set_age(self, new_age): # 判斷傳入的參數(shù)是否符合要求,符合后才能賦值 if new_age > 0 and new_age <=120: self._age = new_age # 獲取私有屬性的值 def get_age(self): return self._age # 創(chuàng)建對象 person = Person("老王", 30) print(person._age)
在例12-1中,定義了一個Person類。其中,第4行在構造方法中添加了一個私有屬性_age,然后在第6~9行定義了一個給私有屬性賦值的方法,通過使用if語句來判斷設置值的合理性,然后在第11~12行定義了一個供外界獲取私有屬性值的方法。第14~15行使用構造方法創(chuàng)建一個Person類的對象,并將直接獲取到的_age屬性的值打印出來。運行程序后,程序出現(xiàn)如下錯誤信息,具體如圖12-1所示。
從圖12-1提示的錯誤信息可以看出,在Person類中沒有找到_age屬性。出現(xiàn)上述問題,原因在于_age屬性為私有屬性,類的外面無法知道類里面的私有屬性,更無法訪問類的私有屬性。所以,為了能在外界訪問私有屬性的值,需要用到該類提供的用于設置和獲取屬性值的方法。
圖12-1 提示沒有_age屬性的錯誤信息
在例12-1中,把第15行代碼改為調用set_age和get_age方法分別對屬性進行賦值和取值的操作,代碼如下。
person.set_age(31) print(person.get_age())
程序運行的結果如圖12-2所示。
圖12-2 運行結果
從圖12-2的結果可以看出,外界通過提供的set_age和get_age方法分別設置和獲取了私有屬性_age的值。Python中沒有任何關鍵字來區(qū)分公有屬性和私有屬性,它是以屬性命名的方法進行區(qū)分的,如果屬性名的前面加了兩個下劃線,就表明該屬性是私有屬性,否則就是公有屬性。