我在Pyramid tutorial for UX design中看到了它。我无法理解这个装饰者的全部内容。
我看到其用法的示例代码。
def __init__(self, request):
self.request = request
renderer = get_renderer("templates/global_layout.pt")
self.global_template = renderer.implementation().macros['layout']
@reify
def company_name(self):
return COMPANY
@reify
def site_menu(self):
new_menu = SITE_MENU[:]
url = self.request.url
for menu in new_menu:
if menu['title'] == 'Home':
menu['current'] = url.endswith('/')
else:
menu['current'] = url.endswith(menu['href'])
return new_menu
@view_config(renderer="templates/index.pt")
def index_view(self):
return {"page_title": "Home"}
@view_config(renderer="templates/about.pt", name="about.html")
def about_view(self):
return {"page_title": "About"}
答案 0 :(得分:37)
从源代码文档:
“”“放置使用此方法的结果(非数据) 第一次调用后,实例dict中的描述符装饰器, 用实例变量有效地替换装饰器。“”“
来自from the fuzzy notepad blog的描述很好地总结了它。
它的作用类似于@property,只是该函数只被调用 一旦;之后,该值将缓存为常规属性。这个 为您提供延迟属性创建 不可变的。
因此,在您发布的代码中,site_menu可以像缓存属性一样进行访问。
答案 1 :(得分:3)
根据文件字符串(source):
""" Put the result of a method which uses this (non-data)
descriptor decorator in the instance dict after the first call,
effectively replacing the decorator with an instance variable."""