2012-05-27 15 views
20

L'ho visto nel Pyramid tutorial for UX design. Non riesco a capire molto di che cosa sia questo decoratore.Che cosa fa '@reify' e quando dovrebbe essere usato?

Esempio di codice in cui ho visto il suo utilizzo.

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

risposta

33

Dalla documentazione del codice sorgente:

""" mettere il risultato di un metodo che usa questo (non dati) decoratore di descrittori nell'istanza dict dopo la prima chiamata, sostituendo efficacemente il decoratore con una variabile di istanza. "" "

Una descrizione da from the fuzzy notepad blog riassume bene.

Esso agisce come @property, tranne che la funzione è chiamato solo volta; successivamente, il valore viene memorizzato nella cache come attributo regolare. Questo fornisce la creazione di attributi pigri su oggetti che devono essere immutabili.

Quindi nel codice che hai postato, site_menu può essere accesso come una proprietà in cache.

3

Secondo il doc string (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.""" 
Problemi correlati