python面向对象高级编程:使用@property

在Python的面向对象编程中,@property 是一个内置的装饰器,它允许将类的方法当作属性来访问。这种机制使得可以对属性的获取(getter)和设置(setter)进行细粒度的控制,同时保持属性访问的简洁性。

基本用法

@property 装饰器通常用于将一个方法转换为只读属性。如果还需要控制属性的设置,可以使用 @<属性名>.setter 装饰器。

示例:只读属性
复制代码

python复制代码

|---|---------------------------------------------------------|
| | class Circle: |
| | def __init__(self, radius): |
| | self._radius = radius # 私有属性,通常使用单下划线或双下划线前缀来表示 |
| | |
| | @property |
| | def radius(self): |
| | """获取圆的半径""" |
| | return self._radius |
| | |
| | @property |
| | def diameter(self): |
| | """获取圆的直径,只读""" |
| | return self._radius * 2 |
| | |
| | @property |
| | def area(self): |
| | """获取圆的面积,只读""" |
| | return 3.14159 * self._radius ** 2 |
| | |
| | # 创建一个 Circle 实例 |
| | c = Circle(5) |
| | |
| | # 访问只读属性 |
| | print(c.radius) # 输出: 5 |
| | print(c.diameter) # 输出: 10.0 |
| | print(c.area) # 输出: 78.53975 |
| | |
| | # 尝试设置只读属性(会报错) |
| | # c.radius = 10 # AttributeError: can't set attribute |

示例:带有setter的属性
复制代码

python复制代码

|---|-----------------------------------------------------------|
| | class CircleWithSetter: |
| | def __init__(self, radius): |
| | self._radius = radius |
| | |
| | @property |
| | def radius(self): |
| | return self._radius |
| | |
| | @radius.setter |
| | def radius(self, value): |
| | if value < 0: |
| | raise ValueError("Radius cannot be negative") |
| | self._radius = value |
| | |
| | # 创建一个 CircleWithSetter 实例 |
| | c = CircleWithSetter(5) |
| | |
| | # 访问和设置属性 |
| | print(c.radius) # 输出: 5 |
| | c.radius = 10 # 设置新的半径 |
| | print(c.radius) # 输出: 10 |
| | |
| | # 尝试设置非法的半径值(会报错) |
| | # c.radius = -1 # ValueError: Radius cannot be negative |

使用场景

  • 封装:隐藏对象的内部实现细节,只暴露必要的接口时。
  • 验证:需要在设置属性值时执行验证逻辑时。
  • 只读属性:某些属性只能被读取而不能被修改时。
  • 懒加载:第一次访问属性时才计算其值时。

注意

  • 使用 @property 可以使代码更加清晰和易于理解。
  • 不要滥用 @property,用于逻辑上应该是属性的东西,而不是用于所有方法。
  • 如果在类中使用了 @property,并且还需要一个对应的setter方法,请确保同时提供 @<属性名>.setter
  • 虽然 @property 提供了对属性访问的细粒度控制,但它也增加了代码的复杂性。在简单的情况下,直接使用普通的属性可能更为合适。
相关推荐
名字还没想好☜5 分钟前
Spring @EventListener 事件驱动解耦实战:同步转异步、事务绑定与顺序控制
java·数据库·后端·python·spring
可乐鸡翅yeah_17 分钟前
hls.js 播放质量埋点实战,采集卡顿、起播、错误指标定位线上用户问题
开发语言·前端·javascript·ecmascript·音视频·m3u8·音视频在线播放
szarron33 分钟前
RF Demo Kit|NanoVNA 射频演示测试板完整上手教程,滤波器、衰减器、SOLT 校准学习板
开发语言·人工智能·学习·php·射频工程·频谱仪
边境悍匪1 小时前
蜗牛学苑 Java 智能体学习 Day39|SpringAI 会话存储、Function‑Call 工具调用、MCP 思维导图复盘
java·开发语言·spring boot·学习·阿里云
ellenwan20261 小时前
看到“最新 AI 量化学习”时,先让表达变清楚
人工智能·python
万物智能信息科技1 小时前
RK3568 的多路显示移植—【万物智能之开源鸿蒙OpenHarmony系统实战开发系列教程】
linux·开发语言·华为·开源·harmonyos
蓝悦无人机1 小时前
Qt Design Studio(QDS)4.8.2项目文件结构详解
开发语言·qt·qt creator·qds·项目文件结构·qtc
yxlalm1 小时前
4.java秒杀项目第四课-后端商品后台接口
java·开发语言
海宇数据2 小时前
零信任架构实战:基于海宇柠檬查出险-登记证构建自动化残值评估网关
人工智能·python·架构·自动化
孙启超2 小时前
【AI开发之Rust】第 1 课:认识 Rust 与开发环境 —— 装好工具链,跑通第一个程序
开发语言·人工智能·后端·ai·rust·安全架构