@property
是內置的裝飾器,與普通裝飾器原理是同樣的,只不過返回的不是函數,而是類對象.@property
負責把一個方法變成屬性進行調用,保證對參數進行必要的檢查。setter
、getter
、deleter
。當屬性只有getter
方法,則爲只有只讀屬性。不然爲可讀寫屬性。定義一個類:函數
class Student(object): def __init__(self,score): self.__score = score ## __score 翻譯成 _Student__score # 容許外部代碼獲取score def get_score(self): print('%s'%self.__score) return self.__score
上述例子中,在綁定屬性的時候,直接把屬性暴露出去,致使能夠隨意修改,可是對score的修改又沒有作校驗限制等。
爲了限制屬性,例如score的範圍,能夠經過一個set_score()方法來設置成績,再經過一個get_score()來獲取成績。
例如:翻譯
class Student(object): def get_score(self): return self.score def set_score(self,value): if not isinstance(value,int): # 先判斷輸入字符的類型 raise ValueError('score must be an integer') if value <0 or value >100: # 輸入的int數據,判斷輸入的範圍 raise ValueError('score must between 0 -100 ') self.score = value
試運行:code
>>> s = Student() # 不須要s=Student(60),由於沒有init方法 >>> s.set_score (60) >>> s.get_score() 60 >>> s.set_score(101) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 8, in set_score ValueError: score must between 0 -100
因此,有沒有既能檢查參數,又能夠用相似屬性這樣簡單的方式來訪問、判斷類的變量呢?
是否還記得裝飾器decorator
能夠給函數動態加上功能?對於類的方法,裝飾器同樣起做用。對象
使用規則:get
例如:it
class Student(object): # score:可讀可寫屬性, getter與setter方法 # 把一個getter方法變成屬性,只須要加上@property就能夠了 @property def score(self): return self._score # 建立另外一個裝飾器@score.setter,負責把一個setter方法變成屬性賦值 @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 # 定義只讀屬性,只定義getter方法 @property def age(self): return self._age
❤ thanks for watching, keep on updating...
點個贊再走吧ast