问题
将一个只读的属性定义为property属性方法,只有在访问它时才参与计算。
但是,一旦访问了该属性,我们希望把计算的值缓存起来,不要每次访问它时都重新计算。
解决方案
class lazyproperty:
def __init__(self, func):
self.func = func
def __get__(self, instance, cls):
"""
当被访问的属性不在底层的实例字典中时,__get__()方法才会被调用
第一次访问时,给实例设置了属性和值,
第二次访问时,直接从实例字典中获取,没有访问__get__()方法
"""
print("instance: ", instance)
print("cls: ", cls)
if instance is None:
return self
else:
value = self.func(instance)
setattr(instance, self.func.__name__, value)
return value
import math
class Circle:
def __init__(self, radius) -> None:
self.radius = radius
@lazyproperty # lazyproperty(area)
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
if __name__ == '__main__':
c = Circle(4.0)
# print(c.radius)
print(c.area)
print(c.area) # 第二次打印时直接从实例字典从获取
标签:__,instance,self,print,radius,惰性,func,求值,属性
From: https://www.cnblogs.com/weiweivip666/p/17889108.html