使用 @property 装饰器可以将一个方法转换为属性。这意味着你可以通过直接访问属性的方式来获取方法的返回值,而不需要使用方法调用的语法。
假设我们有一个类 Circle
,其中定义了一个方法 get_radius()
来获取半径值:
class Circle:
def __init__(self, radius):
self._radius = radius
def get_radius(self): # 为了获取属性值radius特意定制的一个方法
return self._radius
如果我们想要获取半径值,通常需要调用方法:
circle = Circle(5)
radius = circle.get_radius() # 调用上面特意定制的方法来获取实例对象circle的半径值
print(radius) # 输出:5
但是,如果我们将之前特意定制 get_radius()
方法替换掉,使用 @property 装饰器,就可以直接对属性radius进行访问并修改:
class Circle:
def __init__(self, radius):
self._radius = radius
@property
def radius(self): #这个radius就是初始化函数中的radius属性
return self._radius #返回实例对象的属性
现在我们可以直接访问 radius
属性来获取半径值,就像访问普通属性一样:
circle = Circle(5)
radius = circle.radius # 直接访问属性来获取半径值
print(radius) # 输出:5
这样,我们就可以使用属性访问的方式来获取方法的返回值,使代码更加简洁和易读。
如果我们使用了@property对一个属性进行了装饰之后,如果要需要修改该实例对象的circle属性(之前是5),就不能够直接使用circle.radius=2这样子来随便修改属性
class Circle:
def __init__(self, radius):
self._radius = radius
@property
def radius(self):
return self._radius
circle=Circle(5)
print(circle.radius)
circle.radius=2 #这样修改实例对象的属性是错误的,会出现报错
print(circle.radius)
会出现下面这个报错
D:\Anaconda\envs\pytorch\python.exe D:\Pycharm_code\pythonProject64\main.py
4
Traceback (most recent call last):
File "D:\Pycharm_code\pythonProject64\main.py", line 19, in <module>
A1.radius=2
AttributeError: can't set attribute
Process finished with exit code 1
这个时候我们就需要使用@property的配套的装饰器@你要修改的属性.setter来设置当前实例对象的属性radius的新值
class Circle:
def __init__(self, radius):
self._radius = radius
@property
def radius(self):
return self._radius
@radius.setter #对属性radius设置一个setter装饰器
def radius(self, value):
if value < 0:
raise ValueError("Radius cannot be negative.")
self._radius = value
circle=Circle(5)
print(circle.radius) #输出为5
circle.radius=2
print(circle.radius) #新的属性输出为2
综上所述,当属性没有使用 @property 装饰器时,通常需要使用类似于 circle.radius
的语法来直接访问实例对象的属性值。这种方式只能用于获取属性值,而不能用于修改属性值。,如果需要修改属性值的话就需要用到@属性.setter来修改,这个属性的id由你要修改的属性决定,所以使用 @property 装饰器的一个主要作用就是可以提供更加直观和方便的属性访问语法,使属性的获取和修改都可以通过类似于访问属性的方式来进行,增加了代码的可读性和易用性。