2009-06-02 11 views
11

que he notado en varios ejemplos veo cosas como esta:¿Propósito de símbolos @ en Python?

# Comments explaining code i think 
@innerclass 

o:

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

googlear no conseguirme muy lejos, por sólo una definición general de lo que es esto . Además, no puedo encontrar nada realmente en la documentación de Python.

¿Qué es esto?

+0

@uberjumper - Deberías dar la respuesta a abhinavg si crees que ambos nos lo merecemos. Obtuve algo de tráfico libre en mi blog y, de todos modos, tienen menos representantes que yo. –

Respuesta

10

Son decoradores.

<shameless plug> Tengo un blog post sobre el tema. </shameless plug>

+2

Su enchufe desvergonzado, era un artículo extremadamente bien escrito y claro. – UberJumper

4

Con

@function 
def f(): 
    pass 

simplemente envuelve alrededor functionf(). function se llama decorador.

Es simplemente el azúcar sintáctica para lo siguiente:

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

Me gusta esta respuesta, lo suficientemente breve y clara +1 – Patric

21

Se llaman decoradores. Son funciones aplicadas a otras funciones. Aquí hay una copia de mi respuesta a una pregunta similar.

Los decoradores de Python agregan funcionalidad extra a otra función. Un decorador cursiva podría ser como

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

Tenga en cuenta que una función se define dentro de una función. Lo que básicamente hace es reemplazar una función con la recién definida. Por ejemplo, tengo esta clase

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

Ahora digo, quiero que ambas funciones impriman "---" después y antes de que estén hechas. Podría agregar una impresión "---" antes y después de cada declaración de impresión. Pero debido a que no me gusta repetirme, voy a hacer un decorador

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 

Así que ahora puedo cambiar mi clase a

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

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

Para más información sobre decoradores, comprobar http://www.ibm.com/developerworks/linux/library/l-cpdecor.html

+3

Ojalá pudiera dar dos soluciones aceptadas. :( – UberJumper

+1

FYI - la otra respuesta está aquí: http://stackoverflow.com/questions/739654/understanding-python-decorators/739667#739667 –

+0

¿Y por qué incluso necesitas el argumento 'fn' para agregarDash si no lo haces? ¿Lo uso? – wordsforthewise

Cuestiones relacionadas