參數檢查(@property)

綁定屬性時,若是直接把屬性暴露出去,雖然寫起來很簡單,但沒法對參數進行檢查,致使屬性被隨便修改
所以,能夠經過在類內定義get()獲取屬性值,定義set()對屬性值進行設定並對設定值進行檢查

但經過定義get()和set()會讓程序顯得複雜,沒有直接用屬性這麼直接簡單
Python內置的@property裝飾器就是用來負責把一個方法變成屬性調用的,它能夠經過更加簡單的方式來實現上述功能而無需自定義get()和set()
@property普遍應用在類的定義中,能夠讓調用者寫出簡短的代碼,同時保證對參數進行必要的檢查,這樣,程序運行時就減小了出錯的可能性spa

 

class Student(object):

    @property
    def score(self):
        return self._score

    @score.setter
    def score(self, value):
        if not isinstance(value, int):
            raise ValueError('score must be an integer!')
        if value < 0 or value > 100:
            raise ValueError('score must between 0 ~ 100!')
        self._score = value
        
    @property
    def birth(self):
        return self._birth

    @birth.setter
    def birth(self, value):  #birth是可讀寫屬性,由於它有setter
        self._birth = value
    
    #還能夠定義只讀屬性,只定義getter方法,不定義setter方法就是一個只讀屬性
    @property
    def age(self):    #age就是一個只讀屬性,由於它沒有setter
        return 2019 - self._birth
    
    
s = Student()
s.score = 60  # OK,實際轉化爲s.set_score(60)
print(s.score)  # 輸出:60,實際轉化爲s.get_score()
s.score = 9999  # 報預約錯誤
s.birth = 1988  # OK,實際轉化爲s.set_birth(1988)
print(s.birth)  # 輸出:1988,實際轉化爲s.get_birth()
print(s.age)  # 輸出:31,實際轉化爲s.get_age()
相關文章
相關標籤/搜索