@property装饰器
类中的属性可以直接访问和赋值,这为类的使用者提供了方便,但
也带来了问题:类的使用者可能会给一个属性赋上超出有效范围的值。
为了解决这个问题,Python提供了@property装饰器,可以将类中属性的访问和赋值操作自动转为方法调用,这样可以在方法中对属性值的取值范围做一些条件限定。
getter和setter方法
直接使用@property就可以定义一个用于获取属性值的方法(即getter)。
如果要定义一个设置属性值的方法(setter),则需要使用名字“@属性名.setter”的装饰器。
见下方代码示例中:@score.setter
如果一个属性只有用于获取属性值的getter方法,而没有用于设置属性值的setter方法,则该属性是一个只读属性,只允许读取该属性的值,而不能设置改属性的值。
例:通过property装饰器使得学生成绩的取值范围必须在0~100之间。
import datetime
class Student:
@property # 直接使用@property表示定义一个用于获取属性值的方法(即getter)
def score(self): # 用@property装饰器定义一个用于获取score值的方法。
return self._score
'''
在类的setter和getter方法中使用self访问属性时,需要在属性名前加上下划线_,
否则系统会因不断递归调用而报错
'''
@score.setter
def score(self, score): # 用socre.setter定义一个用于设置score值的方法
if score<0 or score>100: # 不符合0~100的限定条件
print('成绩必须在0~100之间!')
else:
self._score=score
@property
def age(self): # 用@property装饰器定义一个用于获取age值的方法。
return datetime.date.today().year - self.birthyear
# datetime.date.today().year 输出结果为2024且类型为'int'
if __name__ == '__main__':
stu=Student() # 创建Student类对象stu
stu.score=80 # 将stu对象的score属性赋值为80
stu.birthyear=2000 # 将stu对象的birthyear属性赋值为2000
print

最低0.47元/天 解锁文章
2065

被折叠的 条评论
为什么被折叠?



