重置宽度或长度时如何重新计算面积?

问题描述 投票:0回答:0

我将

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

如何让它变得更智能?

delegates python-3.6 descriptor
© www.soinside.com 2019 - 2024. All rights reserved.