属性缓存如何在以下代码中工作?

时间:2012-10-15 14:02:10

标签: python

我对以下代码片段的工作原理感到困惑?它是一个装饰器,它会懒惰地初始化属性,然后在下一个请求中使用缓存属性。看看代码,它似乎总是会调用self.method?一点点解释会有所帮助

class cached_property(object):
    def __init__(self, method, name=None):
        self.method = method
        self.name = name or method.__name__
        self.__doc__ = method.__doc__
    def __get__(self, inst, cls):
        if inst is None:
            return self
        result = self.method(inst)
        setattr(inst, self.name, result)
        return result

1 个答案:

答案 0 :(得分:2)

对我而言,它似乎是第一次在result = self.method(inst)周围调用该方法。然后,它将结果替换为实例上的方法:setattr(inst,self.name,result)

在后续的my_instance.my_cached_property上,你实际上是访问方法的(初始)结果(作为常规属性)而不是描述符(原始方法和描述符类没有绑定到类,因为你覆盖了那个属性。)