我将
area
类中的 Room
属性委托给 Lazyproperty
:
class Lazyproperty:
def __init__(self,func):
self.func = func
def __get__(self, instance, owner):
if instance is None:
return self
res = self.func(instance)
setattr(instance,self.func.__name__,res)
return res
class Room:
def __init__(self,name,width,length):
self.name = name
self.width = width
self.length = length
@Lazyproperty
def area(self):
print('calculated')
return self.width*self.length
当Room的aread属性存在时,可以从cached中调用。
r = Room('v1',20,5)
r.area
calculated
100
第一次调用该属性即可计算面积,第二次调用时无
calculated
输出:
r.area
100
有一个缺点,当
area
或Room
重置时,width
实例中的属性length
不会被改变:
r.width = 40
r.area
100
如何让它变得更智能?