首先,@propert的作用是把類中的方法『變成』了屬性,方便通過實例訪問。propert可以有兩種用法:可以把一個方法變成只讀屬性;可以對一些屬性進行過濾。
想象這樣一個場景,在實例化一個類之後,需要對類的一個屬性進行賦值,這時候是沒有對屬性屬性被賦予的值進行判斷的,如果屬性被賦予了一個不合適的值,那麼代碼在後面執行的時候就會報錯,為了避免這種情況,可以有兩種方法解決。
class Student():
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:
raise ValueError('score must between 0 ~ 100!')
self._score = value
if __name__ == '__main__':
s = Student()
s.set_score(value="88")
print(s.get_score())
再Student類中,為了避免直接對 _score 屬性操作,我們提供了 get_score 和 set_score 方法,這樣起到了封裝的作用,把一些不想對外公開的屬性隱蔽起來,而只是提供方法給用戶操作,在方法裡面,我們可以檢查參數的合理性等。這樣做沒什麼問題,但是我們有更簡單的方式來做這件事。
class Teacher():
@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
if __name__ == '__main__':
t = Teacher()
t.score = 10
print(t.score)
t.score = 20
print(t.score)
在上面,我們給方法 score 加上了 @property,於是我們可以把 score 當成一個屬性來用,此時,又會創建一個新的裝飾器 score.setter,它可以把被裝飾的方法變成屬性來賦值。
另外,我們也不一定要使用 score.setter 這個裝飾器,這時 score 就變成一個只讀屬性了:
''' 學習中遇到問題沒人解答?小編創建了一個Python學習交流群:711312441 尋找有志同道合的小伙伴,互幫互助,群裡還有不錯的視頻學習教程和PDF電子書! '''
class test():
def __init__(self, s1):
self.s = s1
@property
def f1(self):
return self.s
if __name__ == '__main__':
t1 = test(s1=90)
print(t1.f1)
注意:最後面一行的print(t1.f1)不要加括號,print(t1.f1()),要不會報錯’int’ object is not callable