用描述符自制@property,并实现延迟计算
class Lazyproperty:
def __init__(self,func):
self.func = func #接收Lazyproperty(area)传入的函数area的地址
def __get__(self, instance, owner):
if instance is None:
return self
res = self.func(instance) #运行area(r1),将返回值给Room的数据属性area
setattr(instance,self.func.__name__,res) #将计算结果放入实例属性字典里面
return res
class Room:
def __init__(self,width,length):
self.width = width
self.length = length
@Lazyproperty #相当于在函数后加area = Lazyproperty(area),作为Room的数据属性,就可被描述符代理
def area(self):
return self.width * self.length #调用实例化的值,运算后返回给area()
r1 = Room(2,5)
print(r1.area)
print(r1.__dict__)
输出:
10
{‘width’: 2, ‘length’: 5, ‘area’: 10}