你想将一个只读属性定义成一个property,并且只在访问的时候才会计算结果。 但是一旦被访问后,你希望结果值被缓存起来,不用每次都去计算。
import math
class lazyproperty:
def __init__(self, func):
self.func = func
def __get__(self, instance, cls):
if instance is None:
return self
else:
print("第一次计算")
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
c = Circle(4.0)
print(c.area)
print(c.area)
第一次计算
计算面积
50.26548245743669
50.26548245743669
这里来解析以下运行原理,首先,先将area作为参数初始化lazyproperty(),当调用c.area时,由于Circle没有area这个实例属性,所以访问非数据描述符,此时自动调用lazyproperty的get,从而给Circle设置了area属性。