一、概述
类中的属性可以直接访问和赋值,这为类的使用者提供了方便,但也带来了问题:类的使用者可能会给一个属性赋上超出有效范围的值。
为了解决这个问题,Python提供了@property装饰器,可以将类中属性的访问和赋值操作自动转为方法调用,这样可以在方法中对属性值的取值范围做一些条件限定。
直接使用@property就可以定义一个用于获取属性值的方法(即getter)。
如果要定义一个设置属性值的方法(setter),则需要使用名字“@属性名.setter”的装饰器。
如果一个属性只有用于获取属性值的getter方法,而没有用于设置属性值的setter方法,则该属性是一个只读属性,只允许读取该属性的值、而不能设置该属性的值。
二、例:通过@property装饰器使得学生成绩的取值范围必须在0~100之间。
import datetime class Student: #定义Student类 @property def score(self): #用@property装饰器定义一个用于获取score值的方法 return self._score #注意:在类的setter和getter方法中使用self访问属性时,需要在属性名前加上 下划线,否则系统会因不断递归调用而报错。 @score.setter def score(self, score): #用score.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.datetime.now().year-self.birthyear if __name__=='__main__': stu=Student() #创建Student类对象stu stu.score=80 #将stu对象的score属性赋值为80 stu.birthyear=2002 #将stu对象的birthyear属性赋值为2002 print('年龄:%d,成绩:%d'%(stu.age,stu.score)) #stu.age=19 #取消前面的注释符则会报错 stu.score=105 #将stu对象的score属性赋值为105 print('年龄:%d,成绩:%d'%(stu.age,stu.score))
成绩必须在0~100之间!
年龄:18,成绩:80
披荆斩棘,仗剑天涯