2012-05-27 1 views
20

Я видел его в Pyramid tutorial for UX design. Я не мог понять, что это за декоратор.Что делает «@reify» и когда он должен использоваться?

Пример кода, где я видел его использование.

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"} 

ответ

33

Из документации исходного кода:

""»Put результат метода, который использует это (не данные) Декоратор дескриптора в экземпляре dict после первого вызова эффективно заменяет декоратор переменной экземпляра. "" "

Описание от from the fuzzy notepad blog подводит итог.

Он действует как @property, за исключением того, что функция только когда-либо называется ; после этого значение кэшируется как обычный атрибут. Это дает вам создание ленивого атрибута на объектах, которые должны быть неизменяемым.

Таким образом, в коде, который вы опубликовали, у site_menu могут быть доступ как свойство кеширования.

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.""" 

 Смежные вопросы

  • Нет связанных вопросов^_^