一、概述
类中的属性可以直接访问和赋值,这为类的使用者提供了方便,但也带来了问题:类的使用者可能会给一个属性赋上超出有效范围的值。
为了解决这个问题,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
披荆斩棘,仗剑天涯
分类:
Python
标签:
python—面向对象
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于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最大的设计失误
· 单元测试从入门到精通