一、概述

  类中的属性可以直接访问和赋值,这为类的使用者提供了方便,但也带来了问题:类的使用者可能会给一个属性赋上超出有效范围的值。

  为了解决这个问题,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
posted on 2021-01-12 11:19  史振兴  阅读(260)  评论(0编辑  收藏  举报