@property 是 Python 中的一个装饰器(decorator),用于定义类的属性。它可以将方法转换为相应的特性(property),从而实现属性的访问和修改控制。
@property 装饰器的作用是将一个方法变成一个只读属性,即通过这个方法可以获取属性值,但不能对它进行赋值操作。使用 @property 装饰器后,这个方法就可以像访问属性一样去调用,而不需要加上 ()。
具体来说,@property 的作用有以下几个方面:
封装属性的访问和修改逻辑:通过定义 getter 和 setter 方法,在获取和设置属性值时可以添加额外的逻辑,例如数据验证、计算属性等。
提供接口一致性:将原本直接访问属性的代码改为调用方法,使得代码在不改变接口的情况下可以灵活地修改属性的实现方式。
隐藏属性的实现细节:将属性的实现方式隐藏在类的内部,对外部用户来说只需要关心如何使用这个属性,而不需要了解其实现细节。
下面是一个简单的示例,演示了 @property 的用法:
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 must be a positive value")
self._radius = value
@property
def area(self):
return 3.14 * self.radius ** 2
circle = Circle(5)
print(circle.radius) # 输出: 5
circle.radius = 10
print(circle.radius) # 输出: 10
circle.radius = -1 # 抛出异常: ValueError: Radius must be a positive value
print(circle.area) # 输出: 314.0
在上面的例子中,@property 装饰器定义了 radius 和 area 这两个属性。radius 属性有对应的 getter 和 setter 方法,它通过 _radius 实例变量存储半径的值,并且在设置半径时进行了验证。area 属性只有 getter 方法,用于计算圆的面积。
需要注意的是,虽然 radius 使用了 @property,但仍然可以直接访问 circle._radius 来获取和修改半径的值。因此,在使用 @property 装饰器时,开发者应该明确约定好哪些属性可以直接访问,哪些属性需要通过装饰器提供的方法去访问。