2009-06-02 20 views
11

Ich habe ich, wie diese Dinge sehen, in mehreren Beispielen bemerkt:Zweck von @ Symbolen in Python?

# Comments explaining code i think 
@innerclass 

oder: Das ist

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

googeln mich nicht sehr weit, denn nur eine allgemeine Definition dessen, was bekommt . Auch kann ich wirklich nichts in der Python-Dokumentation finden.

Was machen diese?

+0

@uberjumper - Sie sollten die Antwort auf abhinavg geben, wenn Sie das Gefühl haben, dass wir es beide verdienen. Ich habe freien Traffic auf meinem Blog und sie haben sowieso weniger Reputation als ich. –

Antwort

10

Sie sind Dekorateure.

<shameless plug> Ich habe eine blog post zum Thema. </shameless plug>

+2

Ihr schamloser Stecker, war ein sehr gut geschriebener und klarer Artikel. – UberJumper

4

Mit

@function 
def f(): 
    pass 

Sie einfach wickeln function um f(). function heißt Decorator.

Es ist nur syntaktischer Zucker für die folgenden:

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

Ich mag diese Antwort, kurz und klar genug +1 – Patric

21

Sie heißen Dekorateure. Sie sind Funktionen, die auf andere Funktionen angewendet werden. Hier ist eine Kopie meiner Antwort auf eine ähnliche Frage.

Python-Dekoratoren fügen einer anderen Funktion zusätzliche Funktionalität hinzu. Ein Kursivschrift Dekorateur wie

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

Hinweis sein könnte, dass eine Funktion innerhalb einer Funktion definiert ist. Was es im Grunde tut, ist eine Funktion durch die neu definierte zu ersetzen. Zum Beispiel habe ich diese Klasse

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

Jetzt sagen, ich möchte beide Funktionen "---" nach und bevor sie fertig sind. Ich könnte einen Druck "---" vor und nach jeder Druckanweisung hinzufügen. Aber weil ich mich nicht mögen, zu wiederholen, werde ich einen Dekorateur machen

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 

So, jetzt kann ich meine Klasse

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

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

Für mehr auf Dekorateure, überprüfen http://www.ibm.com/developerworks/linux/library/l-cpdecor.html

+3

Ich wünschte, ich könnte zwei Menschen akzeptierte Lösung geben. :( – UberJumper

+1

FYI - die andere Antwort ist hier: http://stackoverflow.com/questions/739654/understanding-python-decorators/739667#739667 –

+0

Und warum brauchen Sie sogar das 'Fn' Argument zu AddDashes, wenn Sie nicht ' t use it? – wordsforthewise