随笔 - 86  文章 - 5  评论 - 11  阅读 - 10万 

一、概述

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

  为了解决这个问题,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   史振兴  阅读(270)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示