1. 在类中使用
1.1 @property
- 首先定义一个类
Circular
,经过实例化后,调用类方法radius()
,输出圆的半径。
class Circular(object):
def __init__(self, radius):
self._radius = radius
def radius(self):
return self._radius
circular = Circular(2)
print(circular.radius()) # 2
在Python中,既要保护类的封装特性,又要让开发者可以使用对象.属性
的方式操作类属性,除了使用 property()
函数,Python 还提供了@property
装饰器。通过 @property 装饰器,可以直接通过方法名来访问方法,不需要在方法名后添加小括号()
。实现了以访问属性的方式来访问方法。
class Circular(object):
def __init__(self, radius):
self._radius = radius
@property
def radius(self):
return self._radius
circular = Circular(2)
print(circular.radius) # 2
- 上面程序中,使用
@property
修饰了radius()
方法,这样就使得该方法变成了_radius
属性的getter
方法。需要注意的是,如果类中只包含该方法,那么_radius
属性将是一个只读属性。也就是说,在使用Circular
类时,无法对_radius
属性重新赋值,即运行如下代码会报错:
circular = Circular(2)
circular.radius = 3
print(circular.radius)
而要想实现修改_radius
属性的值,还需要为_radius
属性添加 setter
方法,就需要用到setter
装饰器。
class Circular(object):
def __init__(self, radius):
self._radius = radius
@property
def radius(self):
return self._radius
@radius.setter
def radius(self, value):
self._radius = value
circular = Circular(2)
circular.radius = 3
print(circular.radius) # 3
在上面的程序中,把一个getter
方法变成属性,只需要加上@property
就可以了,此时,@property
本身又创建了另一个装饰器@radius.setter
,负责把一个setter
方法变成属性赋值,于是,我们就拥有一个可控的属性操作。