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 教程。