綁定屬性時,若是直接把屬性暴露出去,雖然寫起來很簡單,但沒法對參數進行檢查,致使屬性被隨便修改
所以,能夠經過在類內定義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()