2009-06-02 6 views
11

Je l'ai remarqué dans plusieurs exemples que je vois des choses comme cela:But de symboles @ en Python?

# Comments explaining code i think 
@innerclass 

ou:

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

recherche sur Google ne me vont pas très loin, juste une définition générale de ce que c'est . Aussi, je ne peux rien trouver vraiment dans la documentation python.

Que font-ils?

+0

@uberjumper - Vous devriez donner la réponse à Abhinavg si vous pensez que nous le méritons tous les deux. J'ai eu du trafic gratuit sur mon blog et ils ont moins de rep que moi de toute façon. –

Répondre

10

Ce sont des décorateurs. Je porte un blog post sur le sujet. </shameless plug>

+2

Votre bouchon éhonté, était un article extrêmement bien écrit et clair. – UberJumper

4

Avec

@function 
def f(): 
    pass 

vous enveloppez tout simplement function autour f(). function est appelé un décorateur.

Il est tout simplement le sucre syntaxique pour ce qui suit:

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

J'aime cette réponse, assez courte et assez claire +1 – Patric

21

Ils sont appelés décorateurs. Ce sont des fonctions appliquées à d'autres fonctions. Voici une copie de ma réponse à une question similaire.

Les décorateurs Python ajoutent des fonctionnalités supplémentaires à une autre fonction. Un décorateur italique pourrait être comme

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

Notez qu'une fonction est définie dans une fonction. Ce qu'il fait essentiellement est de remplacer une fonction par celle nouvellement définie. Par exemple, j'ai cette classe

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

Maintenant, disons que je veux que les deux fonctions impriment "---" après et avant qu'elles ne soient terminées. Je pourrais ajouter une impression "---" avant et après chaque déclaration d'impression. Mais parce que je ne veux me répéter, je ne ferai un décorateur

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 

Alors maintenant, je peux changer ma classe à

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

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

Pour en savoir plus sur les décorateurs, consultez http://www.ibm.com/developerworks/linux/library/l-cpdecor.html

+3

J'aimerais pouvoir offrir deux solutions acceptées. :( – UberJumper

+1

FYI - l'autre réponse est ici: http://stackoverflow.com/questions/739654/understanding-python-decorators/739667#739667 –

+0

Et pourquoi avez-vous même besoin de l'argument 'fn' pour ajouter desDashes si vous ne faites pas – wordsforthewise

Questions connexes