首頁技術(shù)文章正文

Python培訓(xùn):封裝(隱藏?cái)?shù)據(jù)和保護(hù)屬性)

更新時(shí)間:2022-08-03 來源:黑馬程序員 瀏覽量:

  通常把隱藏屬性、方法與方法實(shí)現(xiàn)細(xì)節(jié)的過程稱為封裝。為了保護(hù)類里面的屬性,避免外界隨意賦值,可以采用如下方式解決:

  ·把屬性定義為私有屬性,即在屬性名的前面加上兩個(gè)下劃線。

  ·添加可以供外界調(diào)用的兩個(gè)方法,分別用于設(shè)置或者獲取屬性值。

  在介紹封裝之前,我們先來看一段示例代碼,具體如下:

class Person: # 定義一個(gè)類
    def __init__(self, name, age): # 構(gòu)造方法
        self.name = name # 姓名
        self.age = age   # 年齡
person = Person("老王", 30) # 創(chuàng)建一個(gè)對(duì)象
person.age = 300
print(person.age)

  在上述示例中,定義了一個(gè)Person類,該類中有name(姓名)和age(年齡)兩個(gè)屬性。使用Person類的構(gòu)造方法創(chuàng)建一個(gè)對(duì)象,并設(shè)置nage和age的初始值為“老王”和“30”,接著動(dòng)態(tài)地設(shè)置age的值為300.從現(xiàn)實(shí)生活角度來看,這個(gè)年齡的設(shè)置是不符合邏輯的。

  下面采用封裝的方式,對(duì)上述代碼進(jìn)行修改,具體如例12-1所示。

  例12-1 私有屬性.py

class Person: # 定義一個(gè)類
    def __init__(self, name, age): # 構(gòu)造方法
        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)建對(duì)象
person = Person("老王", 30)
print(person._age)

  在例12-1中,定義了一個(gè)Person類。其中,第4行在構(gòu)造方法中添加了一個(gè)私有屬性_age,然后在第6~9行定義了一個(gè)給私有屬性賦值的方法,通過使用if語句來判斷設(shè)置值的合理性,然后在第11~12行定義了一個(gè)供外界獲取私有屬性值的方法。第14~15行使用構(gòu)造方法創(chuàng)建一個(gè)Person類的對(duì)象,并將直接獲取到的_age屬性的值打印出來。運(yùn)行程序后,程序出現(xiàn)如下錯(cuò)誤信息,具體如圖12-1所示。

  從圖12-1提示的錯(cuò)誤信息可以看出,在Person類中沒有找到_age屬性。出現(xiàn)上述問題,原因在于_age屬性為私有屬性,類的外面無法知道類里面的私有屬性,更無法訪問類的私有屬性。所以,為了能在外界訪問私有屬性的值,需要用到該類提供的用于設(shè)置和獲取屬性值的方法。

1659496113256_提示沒有_age屬性的錯(cuò)誤信息.jpg

圖12-1 提示沒有_age屬性的錯(cuò)誤信息

  在例12-1中,把第15行代碼改為調(diào)用set_age和get_age方法分別對(duì)屬性進(jìn)行賦值和取值的操作,代碼如下。

person.set_age(31)
print(person.get_age())

  程序運(yùn)行的結(jié)果如圖12-2所示。

1659496467399_圖12-2-運(yùn)行結(jié)果.jpg

  圖12-2 運(yùn)行結(jié)果

  從圖12-2的結(jié)果可以看出,外界通過提供的set_age和get_age方法分別設(shè)置和獲取了私有屬性_age的值。Python中沒有任何關(guān)鍵字來區(qū)分公有屬性和私有屬性,它是以屬性命名的方法進(jìn)行區(qū)分的,如果屬性名的前面加了兩個(gè)下劃線,就表明該屬性是私有屬性,否則就是公有屬性。

分享到:
在線咨詢 我要報(bào)名
和我們?cè)诰€交談!