ZetCode

Python @property 装饰器

最后修改于 2025 年 2 月 25 日

Python 中的 @property 装饰器用于定义可以像属性一样访问的方法。它允许我们为类属性创建 getter、setter 和 deleter,使我们能够控制对属性的访问并添加验证或计算逻辑。本教程通过实际示例涵盖了 @property 装饰器的用法。

@property 装饰器是 Python 中的一个内置装饰器,它允许我们将方法定义为属性。属性的访问方式类似于属性,但可以包含额外的逻辑,例如验证或计算。@property 装饰器用于定义 getter 方法,而 @<property>.setter@<property>.deleter 装饰器分别用于定义 setter 和 deleter 方法。

创建简单属性

此示例演示了如何使用 @property 装饰器创建简单属性。

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

    @property
    def radius(self):
        return self._radius

circle = Circle(5)
print(circle.radius)  # Output: 5

radius 方法用 @property 装饰,使其成为 _radius 属性的 getter。属性的访问方式类似于属性,不带括号。

添加 Setter

此示例演示了如何向属性添加 setter。

property_setter.py
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:
            raise ValueError("Radius cannot be negative")
        self._radius = value

circle = Circle(5)
print(circle.radius)  # Output: 5

circle.radius = 10
print(circle.radius)  # Output: 10

# circle.radius = -5  # Raises ValueError

@radius.setter 装饰器为 radius 属性定义了一个 setter。setter 包含验证,以确保半径不是负数。

添加 Deleter

此示例演示了如何向属性添加 deleter。

property_deleter.py
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:
            raise ValueError("Radius cannot be negative")
        self._radius = value

    @radius.deleter
    def radius(self):
        print("Deleting radius")
        del self._radius

circle = Circle(5)
print(circle.radius)  # Output: 5

del circle.radius  # Output: Deleting radius
# print(circle.radius)  # Raises AttributeError

@radius.deleter 装饰器为 radius 属性定义了一个 deleter。当在属性上使用 del 语句时,会调用 deleter。

计算属性

此示例演示了如何使用 @property 装饰器创建计算属性。

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

    @property
    def radius(self):
        return self._radius

    @property
    def area(self):
        return 3.14 * self._radius ** 2

circle = Circle(5)
print(circle.area)  # Output: 78.5

area 属性是一个计算属性,它根据半径计算圆的面积。它的访问方式类似于属性,但在访问时会执行计算。

只读属性

此示例演示了如何创建只读属性。

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

    @property
    def radius(self):
        return self._radius

circle = Circle(5)
print(circle.radius)  # Output: 5

# circle.radius = 10  # Raises AttributeError

radius 属性是只读的,因为它没有 setter。尝试为其赋值会引发 AttributeError

使用 @property 的最佳实践

来源

Python @property 文档

在本文中,我们探讨了 Python @property 装饰器,并通过实际示例演示了它的用法。

作者

我的名字是 Jan Bodnar,我是一名充满热情的程序员,拥有丰富的编程经验。我自 2007 年以来一直在撰写编程文章。迄今为止,我已撰写了 1,400 多篇文章和 8 本电子书。我在教授编程方面拥有十多年的经验。

列出所有 Python 教程