Menu
CoddyTech

属性装饰器

本课属于 Coddy Python 学习旅程的“面向对象编程”单元。第 10 课,共 64 课。

@property 装饰器让你可以像访问属性一样访问方法,提供了一种简洁的方式来获取和设置值。这对于封装很有用,你可以添加验证逻辑或计算值,而无需更改类的公共接口。

下面是一个使用 @property 的类示例:

class Circle:
    def __init__(self, radius):
        self._radius = radius
    
    @property
    def radius(self):
        return self._radius
    
    @property
    def area(self):
        return 3.14159 * self._radius ** 2

注意,我们使用 self._radius 来存储实际值。如果在 getter 中使用 self.radius,它会再次调用 getter 方法,从而导致无限递归。

创建一个圆并访问其属性:

my_circle = Circle(5)

像访问普通属性一样访问属性:

print(my_circle.radius)
print(my_circle.area)

输出:

5
78.53975

注意,访问属性时不使用括号 (),它们看起来像属性,但会运行方法代码。

添加一个设置器,以便通过验证来更改值:

class Circle:
    def __init__(self, radius):
        self._radius = radius
    
    @property
    def radius(self):
        return self._radius
    
    @radius.setter
    def radius(self, value):
        if value > 0:
            self._radius = value
        else:
            print("Radius must be positive!")

现在,你可以像设置属性一样设置半径:

my_circle = Circle(5)
my_circle.radius = 10  # 使用 setter 方法
print(my_circle.radius)  # 使用 getter 方法

输出:

10

要点:@property 可以让方法看起来像属性,而 @property_name.setter 可以让你控制值的赋值方式,从而实现数据验证和封装。

亲手试试

这节课没有代码挑战。

quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

面向对象编程中的所有课

自己练习: Python 在线编译器