很多时候,构造一个延迟计算属性的主要目的是为了提升性能
你想将一个只读属性定义成一个property,并且只在访问的时候才会计算结果。
但是一旦被访问后,你希望结果值被缓存起来,不用每次都去计算。
定义一个延迟属性的一种高效方法是通过使用一个描述器类,如下:
import math
class Lazyproperty:
def __init__(self, func):
self.func = func
def __get__(self, instance, cls):
if instance is None:
return self
else:
value = self.func(instance)
setattr(instance, self.func.__name__, value)
return value
class Circle:
def __init__(self, radius):
self.radius = radius
@Lazyproperty
def area(self):
print('Computing area')
return math.pi * self.radius ** 2
@Lazyproperty
def perimeter(self):
print('Computing perimeter')
return 2 * math.pi * self.radius
c = Circle(1)
print(c.area)
print(c.perimeter)
网友评论