2009-06-02 9 views
11

Ho notato in diversi esempi che vedo cose come questa:Scopo di @ simboli in Python?

# Comments explaining code i think 
@innerclass 

o:

def foo(): 
""" 
Basic Doc String 
""" 
@classmethod 

Googling non farmi molto lontano, solo per una definizione generale di che cosa si tratta . Inoltre non riesco a trovare nulla nella documentazione di Python.

Cosa fanno?

+0

@uberjumper - Dovresti dare la risposta ad abhinavg se senti che ci meritiamo entrambi. Ho avuto del traffico gratuito sul mio blog e hanno comunque meno rappresentanti di me. –

risposta

10

Sono decoratori.

<shameless plug> Ho un blog post sull'argomento. </shameless plug>

+2

La tua spina spudorata, era un articolo estremamente ben scritto e chiaro. – UberJumper

4

Con

@function 
def f(): 
    pass 

semplicemente avvolgere intorno functionf(). function è chiamato decoratore.

E 'di zucchero sintattico per i seguenti:

def f(): 
    pass 
f=function(f) 
+0

Mi piace questa risposta, breve e abbastanza chiara +1 – Patric

21

Si chiamano decoratori. Sono funzioni applicate ad altre funzioni. Ecco una copia della mia risposta a una domanda simile.

I decoratori Python aggiungono funzionalità aggiuntive a un'altra funzione. Un corsivo decoratore potrebbe essere come

def makeitalic(fn): 
    def newFunc(): 
     return "<i>" + fn() + "</i>" 
    return newFunc 

noti che una funzione è definita all'interno di una funzione. Quello che fa fondamentalmente è sostituire una funzione con quella appena definita. Ad esempio, ho questa classe

class foo: 
    def bar(self): 
     print "hi" 
    def foobar(self): 
     print "hi again" 

Ora dicono, voglio entrambe le funzioni per la stampa "---" dopo e prima di essere fatto. Potrei aggiungere una stampa "---" prima e dopo ogni dichiarazione di stampa. Ma perché non mi piace ripetermi, farò un decoratore

def addDashes(fn): # notice it takes a function as an argument 
    def newFunction(self): # define a new function 
     print "---" 
     fn(self) # call the original function 
     print "---" 
    return newFunction 
    # Return the newly defined function - it will "replace" the original 

Così ora posso cambiare la mia classe per

class foo: 
    @addDashes 
    def bar(self): 
     print "hi" 

    @addDashes 
    def foobar(self): 
     print "hi again" 

Per ulteriori informazioni su decoratori, controllare http://www.ibm.com/developerworks/linux/library/l-cpdecor.html

+3

Vorrei poter dare a due persone la soluzione accettata. :( – UberJumper

+1

FYI - l'altra risposta è qui: http://stackoverflow.com/questions/739654/understanding-python-decorators/739667#739667 –

+0

E perché hai bisogno dell'argomento 'fn' per aggiungereDash se non lo fai? usarlo? – wordsforthewise