Python @property 装饰器
最后修改于 2025 年 2 月 25 日
Python 中的 @property
装饰器用于定义可以像属性一样访问的方法。它允许我们为类属性创建 getter、setter 和 deleter,使我们能够控制对属性的访问并添加验证或计算逻辑。本教程通过实际示例涵盖了 @property
装饰器的用法。
@property
装饰器是 Python 中的一个内置装饰器,它允许我们将方法定义为属性。属性的访问方式类似于属性,但可以包含额外的逻辑,例如验证或计算。@property
装饰器用于定义 getter 方法,而 @<property>.setter
和 @<property>.deleter
装饰器分别用于定义 setter 和 deleter 方法。
创建简单属性
此示例演示了如何使用 @property
装饰器创建简单属性。
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。
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。
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
装饰器创建计算属性。
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
属性是一个计算属性,它根据半径计算圆的面积。它的访问方式类似于属性,但在访问时会执行计算。
只读属性
此示例演示了如何创建只读属性。
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 的最佳实践
- 用于封装: 使用
@property
封装属性的访问,并添加验证或计算逻辑。 - 保持属性简单: 避免在属性中使用复杂逻辑,以保持代码的可读性和性能。
- 记录属性: 清楚地记录属性的目的和行为,以提高代码的可维护性。
- 使用只读属性: 对在初始化后不应修改的属性使用只读属性。
来源
在本文中,我们探讨了 Python @property
装饰器,并通过实际示例演示了它的用法。
作者
列出所有 Python 教程。