为什么要使用@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
可以让一个属性成为‘只读’属性