3. 特性属性装饰器
property 是内置类,它是一个类装饰器。
通过 property 装饰器,可以将被装饰方法名重新绑定为特性属性的操作。
装饰器
@property(fget=None) 或 @property.getter(fget=None)
- 装饰取值方法
@property.setter(fset=None)
- 装饰赋值方法
@property.deleter(fdel=None)
- 装饰删除方法
示例
# 特性属性装饰器的应用 示例
import math
class Circle: # 圆类
def __init__(self, r=1):
self.__radius = r # 半径
@property
def radius(self):
return self.__radius
@radius.setter
def radius(self, r):
if r < 0:
raise ValueError('圆的半径不允许小于零!')
self.__radius = r
@radius.deleter
def radius(self):
print('不允许删除圆的半径')
@property
def area(self):
return math.pi * self.__radius ** 2
@area.setter
def area(self, area):
self.__radius = math.sqrt(area / math.pi)
c = Circle(10)
# print('圆的半径:', c.get_radius())
# c.set_radius(-100)
print('圆的半径:', c.radius)
# c.radius = -100
# print('圆的半径:', c.radius)
# del c.radius
# print('圆的半径:', c.radius)
print('圆的面积:', c.area)
c.area = 200
print('圆的半径:', c.radius)
注意:第一次
@property
def radius(self):
return self.__radius
后 radius 绑定的是一个 property 对象。之后的 radius.setter 都是 property对象的方法。
上述程序完美实现了上一节课一样的功能,且少了几个get_radius、set_radius 和 del_radius 属性来绑定方法。
练习
写一个正方形类,有三个属性:
- 边长 length of a side
- 周长 perimeter
- 面积 area
用此类创建的对象,此三个属性其中一个属性改变,其他所有属性同步变化。
注:用特殊属性@property实现。