Python进阶实例 第30例: property 属性装饰器

在面向对象编程中,有时我们希望 像访问属性一样调用方法,这时可以使用 @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

步骤说明:

  1. 定义只读属性
  2. @property 把方法包装成属性,例如 c.area。
  3. 定义可写属性
  4. 使用 @属性名.setter 允许修改。
  5. 在 radius.setter 中加校验逻辑,防止非法赋值。
  6. 私有变量 _r
  7. 用于存储实际值,避免和属性方法冲突。

总结:

  • @property 让方法可以像属性一样调用,提升代码可读性。
  • 常用于数据保护和计算属性(例如自动更新的面积)。
  • 结合 setter 和 deleter 可以实现完整的封装逻辑。
© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容