2012-05-27 19 views
20

Lo vi en el Pyramid tutorial for UX design. No pude entender mucho de lo que se trata este decorador.¿Qué hace '@reify' y cuándo debería usarse?

Código de muestra donde vi su uso.

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

Respuesta

33

A partir de la documentación de código fuente:

""" Poner el resultado de un método que utiliza esta (no datos) descriptor decorador en la instancia dict después de la primera llamada, reemplazando efectivamente el decorador con una variable de instancia. "" "

Una descripción de from the fuzzy notepad blog lo resume muy bien.

Actúa como @property, excepto que la función solo se llama una vez; después de eso, el valor se guarda en la memoria caché como un atributo regular. Este le da la creación de atributos vagos en objetos que están destinados a ser inmutables.

Por lo tanto, en el código que ha publicado, el sitio_menu puede tener acceso como una propiedad en caché.

3

De acuerdo con la cadena de documentación (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.""" 
Cuestiones relacionadas