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

在 Python 中,可以使用 @property 装饰器把一个方法变成 只读属性,从而让对象的接口更加简洁和优雅。
同时,还可以配合 @<属性名>.setter@<属性名>.deleter 来定义可写属性和可删除属性。


问题描述:

我们需要定义一个 Circle 类:

  • 通过半径 radius 初始化;
  • 提供只读属性 area(圆的面积);
  • 提供可读写属性 radius;
  • 提供可读属性 diameter(直径)。

代码示例:

import math

class Circle:
    def __init__(self, radius):
        self._radius = radius

    # radius 属性
    @property
    def radius(self):
        return self._radius

    @radius.setter
    def radius(self, value):
        if value <= 0:
            raise ValueError("半径必须为正数")
        self._radius = value

    # 直径 (只读属性)
    @property
    def diameter(self):
        return self._radius * 2

    # 面积 (只读属性)
    @property
    def area(self):
        return math.pi * (self._radius ** 2)


# 使用示例
c = Circle(5)
print("半径:", c.radius)
print("直径:", c.diameter)
print("面积:", c.area)

c.radius = 10
print("更新后的半径:", c.radius)
print("新的面积:", c.area)

# 尝试设置非法半径
try:
    c.radius = -3
except ValueError as e:
    print("错误:", e)

运行结果:

半径: 5
直径: 10
面积: 78.53981633974483
更新后的半径: 10
新的面积: 314.1592653589793
错误: 半径必须为正数

总结:

  • @property 让方法看起来像属性一样被访问。
  • 可以用 @xxx.setter 定义属性的写入规则。
  • 可以用 @xxx.deleter 定义删除属性时的行为。
  • 常用于 属性封装、计算属性 的场景。
© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容