当前位置: 首页 > news >正文

python学习笔记 | 11.2、面向对象高级编程-使用@property

一、先搞懂:我们为什么要用 @property?

1. 原始问题

直接给对象赋值,没法检查数据是否合法

class Student: pass s = Student() s.score = 9999 # 成绩不可能是9999,完全不合理!

2. 笨办法解决(太麻烦)

get_xxxset_xxx方法手动检查:

class Student: def get_score(self): return self._score def set_score(self, value): # 检查:必须是整数、0-100之间 if not isinstance(value, int): raise ValueError("必须是整数") if value < 0 or value > 100: raise ValueError("成绩必须0~100") self._score = value

调用时要写方法,一点都不简洁

s = Student() s.set_score(60) print(s.get_score())

3. 终极方案:@property

✅ 既能检查数据✅ 又能()

二、核心知识点:@property 怎么用?

1. 两个关键装饰器

  1. @property:把一个方法变成可读属性(getter)
  2. @方法名.setter:把一个方法变成可写属性(setter,用来检查数据)

2. 固定写法(万能模板)

class 类名: @property def 属性名(self): return self._属性名 # 前面加下划线,避免重名递归! @属性名.setter def 属性名(self, 值): # 这里写数据检查 self._属性名 = 值

3. 重要警告(必看!)

属性方法名 ≠ 实例变量名

错误写法会无限递归、程序崩溃:

# ❌ 错误! @property def birth(self): return self.birth # 无限调用自己

正确写法:实例变量前面加下划线_

# ✅ 正确 @property def birth(self): return self._birth

三、超简单实例(一看就懂)

实例 1:可读写 + 数据检查(成绩)

class Student: # 读:获取成绩 @property def score(self): return self._score # 写:设置成绩 + 检查 @score.setter # @方法名.setter**:把一个方法变成**可写属性**(setter,用来检查数据) def score(self, value): if not isinstance(value, int): # 判断数据类型 raise ValueError("成绩必须是整数!") if value < 0 or value > 100: raise ValueError("成绩必须 0~100!") self._score = value

使用效果:

s = Student() s.score = 88 # 像属性一样赋值 print(s.score) # 像属性一样读取 s.score = 9999 # 报错!自动检查,保护数据

实例 2:只读属性(不能修改)

只加@property不加 setter就是只读:

class Student: @property def birth(self): return self._birth @birth.setter def birth(self, value): self._birth = value # 只读属性:只能看,不能改 @property def age(self): return 2025 - self._birth

使用效果:

s = Student() s.birth = 2000 print(s.age) # 25,可以读 s.age = 18 # 报错!不能修改

四、思路总结(做题万能思路)

  1. 要给类加可控属性,就用@property
  2. 读方法:@property+ 返回self._变量
  3. 写方法:@变量.setter+ 数据检查 + 赋值self._变量
  4. 只读属性:只写@property,不写 setter
  5. 变量名前必须加_,防止递归崩溃

五、课后练习题(教程原题 + 完整答案)

题目要求

Screen类加上:

  1. width:可读写,普通属性
  2. height:可读写,普通属性
  3. resolution只读属性= width × height
## 五、课后练习题(教程原题 + 完整答案) ### 题目要求 # 给 `Screen` 类加上: # 1. `width`:可读写,普通属性 # 2. `height`:可读写,普通属性 # 3. `resolution`:**只读属性** = width × height class Screen: ##属性1 @property def width(self):#可读 return self._width @width.setter #可写 def width(self,value): self._width=value ##属性2 @property def height(self):#可读 return self._height @height.setter #可写 def height(self,value): self._height=value ##属性3 只读 @property def resolution(self): return self._width*self._height

完整答案(直接复制运行)

class Screen(object): # width 可读写 @property def width(self): return self._width @width.setter def width(self, value): self._width = value # height 可读写 @property def height(self): return self._height @height.setter def height(self, value): self._height = value # resolution 只读属性 = 宽 × 高 @property def resolution(self): return self._width * self._height # 测试代码 s = Screen() s.width = 1024 s.height = 768 print('resolution =', s.resolution) if s.resolution == 786432: print('测试通过!') else: print('测试失败!')

运行结果

resolution = 786432 测试通过!

六、必背总结

  1. @property = 让方法像属性一样读
  2. @xxx.setter = 让方法像属性一样写 + 检查数据
  3. 实例变量必须用_变量名,避免死循环
  4. 只写@property就是只读属性
  5. 好处:代码简单 + 数据安全

=分割线=理解@property

@property 作用:告诉 Python这个 def 里面写的取数据流程,不要当成函数调用直接当成普通属性来用

http://www.jsqmd.com/news/854978/

相关文章:

  • 菩瓦纽课业平台:精准追踪错题根源,让每一份努力都有回响
  • 蜂窝板幕墙技术全解析:四川铝单板/四川铝方管/四川铝方通/型材铝方通/外墙格栅铝方管/外墙蜂窝板/选材 - 优质品牌商家
  • 保姆级图解:用Wireshark抓包分析PCI总线上的读写时序(附实战案例)
  • 合肥瓷砖批发TOP5全面评测|瓷砖选购避坑指南 - 行业深度观察C
  • 告别外挂SDRAM!用SWM34SRET6这颗内置8MB内存的MCU驱动4.3寸屏,成本直降
  • 聚焦新型有效成分,守护爱宠健康
  • 中华民族站起来了-《AI驱动上下五千年:从结绳记事到智能纪元》-九品中正制——一个失败的“人才推荐算法“
  • 保姆级教程:用ENVI 5.3搞定Landsat8影像的辐射与大气校正(附海淀区裁剪实例)
  • XRSLAM:开源视觉惯性里程计库,赋能移动端AR应用开发
  • 从模拟到数字:Sigma-Delta调制器如何成为现代ADC的降噪利器?
  • 杭州年份茅台回收机构实测对比:专业度与服务解析 - 优质品牌商家
  • 告别官方臃肿,B站TV版新选择:MyBili v1.3.4 深度体验与下载指南
  • 菩瓦纽课业平台:少刷无用题,专攻薄弱点,让高效提分不内卷
  • 不止于对话:将本地ChatGLM-6B接入Unity游戏,打造你的专属AI NPC
  • 谷歌开发者大会发布多项AI更新:Gemini升级、搜索改版,加速AI生态商业化
  • 融合不确定性的智能车行车态势评估与交互性决策控制方法【附模型】
  • 深度观察:从静态路牌到智能交互,城市导视系统的三次进化
  • 深度解析msvcr120.dll丢失诱因:误删、病毒、运行库损坏逐一排查修复
  • SolidWorks 服务器资源不够 10 人用?云飞云智能分配云桌面,一人一桌面不打架
  • llychaom3u8-downloader:m3u8格式视频多线程下载工具
  • 5大过程组、十大知识领域和49个子过程的英文拼写
  • 猫抓浏览器扩展:3分钟学会免费下载在线视频的完整指南 [特殊字符]
  • 惠来海康医院眼科第三十六个全国助残日公益助残行动
  • 手把手教你复现CVE-2022-25578:利用.htaccess文件上传绕过,在Taocms 3.0.2靶场拿Flag
  • 终极解决方案:pdf2pptx让LaTeX PDF幻灯片在PowerPoint中完美展示
  • 终极指南:在Windows上使用iperf3进行专业网络性能测试
  • 如何通过 Tailscale SSH 功能安全远程连接 Linux 服务器
  • 2026本地视频怎么去水印?本地视频去水印方法和软件推荐全盘点
  • TaotokenAPI密钥的精细化权限管理与审计日志查看体验
  • Flutter代码混淆实战指南:原理、配置与常见问题解决方案