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 属性来绑定方法。

练习

写一个正方形类,有三个属性:

  1. 边长 length of a side
  2. 周长 perimeter
  3. 面积 area

用此类创建的对象,此三个属性其中一个属性改变,其他所有属性同步变化。

注:用特殊属性@property实现。