在面向对象编程中,有时我们希望 像访问属性一样调用方法,这时可以使用 @property 装饰器。
它能让方法变成“只读属性”,并且支持 @属性名.setter 和 @属性名.deleter 定义可写和删除行为。
问题描述:
实现一个类 Circle:
- 初始化时传入半径 r;
- 提供 area(面积) 和 diameter(直径) 属性;
- 半径可以修改,修改后面积会自动更新;
- 半径不允许设置负数。
代码示例:
import math
class Circle:
def __init__(self, r):
self._r = r # 使用私有属性存储
@property
def radius(self):
return self._r
@radius.setter
def radius(self, value):
if value <= 0:
raise ValueError("半径必须为正数")
self._r = value
@property
def diameter(self):
return 2 * self._r
@property
def area(self):
return math.pi * (self._r ** 2)
# 使用示例
c = Circle(5)
print("半径:", c.radius)
print("直径:", c.diameter)
print("面积:", c.area)
c.radius = 10 # 修改半径
print("新的面积:", c.area)
运行结果:
半径: 5
直径: 10
面积: 78.53981633974483
新的面积: 314.1592653589793
步骤说明:
- 定义只读属性
- @property 把方法包装成属性,例如 c.area。
- 定义可写属性
- 使用 @属性名.setter 允许修改。
- 在 radius.setter 中加校验逻辑,防止非法赋值。
- 私有变量 _r
- 用于存储实际值,避免和属性方法冲突。
总结:
- @property 让方法可以像属性一样调用,提升代码可读性。
- 常用于数据保护和计算属性(例如自动更新的面积)。
- 结合 setter 和 deleter 可以实现完整的封装逻辑。
© 版权声明
文章版权归作者所有,未经允许请勿转载。如内容涉嫌侵权,请在本页底部进入<联系我们>进行举报投诉!
THE END
















暂无评论内容