爲什麼要使用@property
需求如下:
- 我們希望對一個成員屬性的訪問加以限制,按照常規思路是寫一個或多個訪問函數來實現訪問修改等操作
- 如果我們仍然想通過屬性(變量)名來訪問屬性可不可以呢
答案是可以的,這裏Python提供了了一種很神奇的方案,名爲@property的函數修飾器
直接上例子
class Student(object):
__score = 0.0
def __init__(self):
pass
@property # 這樣一來就可以直接通過.score而不是.score()來訪問__score了
def score(self):
return self.__score
# 這個時候@property會自動生成一個.setter裝飾器,這裏我們寫人@score.setter
# 重載score方法,就可以通過.score來設置成員屬性,同時實現對屬性的修改限制
@score.setter
def score(self, value: float):
if 0 <= value <= 100:
self.__score = value
else:
raise ValueError
if __name__ == '__main__':
stu1 = Student()
stu1.score = 88.5
try:
stu1.score = 200
except ValueError:
print('ValueError')
print(stu1.score)
@property
可以實現讓用戶直接通過成員方法名來調用成員方法,因此使用stu1.score
可以直接得到return
關鍵字後面返回的結果- 對
score
方法使用了@property
後,修飾器本身又創建了另一個修飾器@score.setter
從名字就可以看出來這個是用來賦值的 - 我們重載
score
方法,並使用@score.setter
修飾器,就可以用=
對score
賦值:stu1.score = 200
(個人認爲這裏其實是重載了=
運算符)
運行結果如下:
ValueError
88.5
另外,如果我們不使用@score.setter
而僅僅使用@property
可以讓一個屬性成爲‘只讀’屬性