在 Python 中,@property
和 @<property_name>.setter
装饰器用于将类的方法转换为属性的 getter 和 setter 方法。这样做的好处是,你可以像访问普通属性一样访问这些方法,同时还能在访问或修改属性时执行一些额外的逻辑。
以下是一个简单的示例,展示了如何使用 @property
和 @<property_name>.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("半径不能是负数")
self._radius = value
@property
def diameter(self):
"""计算并获取圆的直径"""
return self._radius * 2
@property
def area(self):
"""计算并获取圆的面积"""
import math
return math.pi * self._radius ** 2
# 使用示例
circle = Circle(5)
# 访问属性
print("Radius:", circle.radius) # 输出: Radius: 5
print("Diameter:", circle.diameter) # 输出: Diameter: 10
print("Area:", circle.area) # 输出: Area: 78.53981633974483
# 修改属性
circle.radius = 10
print("New Radius:", circle.radius) # 输出: New Radius: 10
print("New Diameter:", circle.diameter) # 输出: New Diameter: 20
print("New Area:", circle.area) # 输出: New Area: 314.1592653589793
# 尝试设置无效的半径
try:
circle.radius = -1
except ValueError as e:
print(e) # 输出: 半径不能是负数
关键点
- @property: 将一个方法转换为属性的 getter 方法。当你访问这个属性时,实际上是在调用这个方法。
- @<property_name>.setter: 将一个方法转换为属性的 setter 方法。当你设置这个属性时,实际上是在调用这个方法。
- 私有属性: 使用下划线前缀(如
_radius
)表示属性是私有的,不应在类外部直接访问。而是通过 getter 和 setter 方法来访问和修改这些属性。
通过这种方式,你可以在不改变类外部调用代码的情况下,对属性的访问和修改进行细粒度的控制,同时还能在访问或修改属性时执行一些额外的逻辑(如验证输入值)。