在线查看webapp2文档时,我找到了有关装饰器webapp2.cached_property
的信息(可在https://webapp-improved.appspot.com/api/webapp2.html#webapp2.cached_property找到)。
在文档中,它说:
将函数转换为惰性属性的装饰器。
我的问题是:
谢谢!
答案 0 :(得分:7)
第一次通话后,它是一个property
装饰器。它允许您自动缓存计算值。
standard library @property
decorator是data descriptor object并且总是被调用,即使同名实例上有属性。
另一方面,@cached_property
装饰器仅具有__get__
方法,这意味着如果已存在具有相同名称的属性,则不会调用它。它通过在第一次调用时在实例上设置具有相同名称的属性来使用它。
在名为@cached_property
的实例上给出bar
- 装饰foo
方法,会发生以下情况:
Python解析foo.bar
。在实例上找不到bar
属性。
Python在类中找到bar
描述符,并在其上调用__get__
。
cached_property
__get__
方法调用已修饰的bar
方法。
bar
方法会计算某些内容,并返回字符串'spam'
。
cached_property
__get__
方法获取返回值并在实例上设置新属性bar
; foo.bar = 'spam'
。
cached_property
__get__
方法返回'spam'
返回值。
如果再次要求foo.bar
,Python会在实例上找到bar
属性,并从此处开始使用。
另见source code for the original Werkzeug implementation:
# implementation detail: this property is implemented as non-data # descriptor. non-data descriptors are only invoked if there is # no entry with the same name in the instance's __dict__. # this allows us to completely get rid of the access function call # overhead. If one choses to invoke __get__ by hand the property # will still work as expected because the lookup logic is replicated # in __get__ for manual invocation.