python学习笔记 | 11.2、面向对象高级编程-使用@property 一、先搞懂我们为什么要用 property1. 原始问题直接给对象赋值没法检查数据是否合法class Student: pass s Student() s.score 9999 # 成绩不可能是9999完全不合理2. 笨办法解决太麻烦写get_xxx和set_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. 两个关键装饰器property把一个方法变成可读属性getter方法名.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 # 报错不能修改四、思路总结做题万能思路要给类加可控属性就用property读方法property 返回self._变量写方法变量.setter 数据检查 赋值self._变量只读属性只写property不写 setter变量名前必须加_防止递归崩溃五、课后练习题教程原题 完整答案题目要求给Screen类加上width可读写普通属性height可读写普通属性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._widthvalue ##属性2 property def height(self):#可读 return self._height height.setter #可写 def height(self,value): self._heightvalue ##属性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 测试通过!六、必背总结property 让方法像属性一样读xxx.setter 让方法像属性一样写 检查数据实例变量必须用_变量名避免死循环只写property就是只读属性好处代码简单 数据安全分割线理解propertyproperty 作用告诉 Python这个 def 里面写的取数据流程不要当成函数调用直接当成普通属性来用