Die Syntax des Decorators beginnt mit @, gefolgt vom Namen der Decorator-Funktion und optionalen Parametern.
Nach der Decorator-Deklaration folgen die dekorierte Funktion und die optionalen Parameter der dekorierten Funktion wie folgt:
@decorator(dec_opt_args)
def func(func_args ):
....
Tatsächlich ist ein Dekorator tatsächlich eine Funktion, eine Funktion, die zum Umschließen einer Funktion verwendet wird. Der Dekorator wird aufgerufen, wenn die Funktionsdeklaration abgeschlossen ist Nach dem Aufruf wird es durch eine vom Dekorateur dekorierte Funktion ersetzt.
Zum Beispiel:
def deco(func): ... return func @deco def foo(): print 'foo' #----------------------------------- #等价如下: def deco(func): ... return func def foo(): print 'foo' foo = deco(foo) 如下例子: def deco1(func): print 'ok' return func @deco1 def foo(): print 'foo' foo() #输出-------------- #ok #foo #------------------
Wenn Sie keine Dekoratoren verwenden, können Sie Folgendes tun:
def deco1(func): print 'ok' return func def foo(): print 'foo' print foo #<function foo at 0x00AFE6F0> foo = deco1(foo) foo() #输出-------------- #ok #foo #------------------
Wenn Sie die beiden vergleichen, können Sie dies mithilfe von sehen Dekorateure sind so einfach. Besonders in der Entwicklung auf Unternehmensebene.
Mehrere Dekoratoren können auch überlappend verwendet werden:
def deco1(func): print 'deco1' return func def deco2(func): print 'deco2' return func @deco1 @deco2 def foo(): print 'foo' foo() #输出如下:----------- #deco2 #deco1 #foo #---------------------
entspricht:
@deco1 @deco2 def foo(arg):pass -----------与下等效---------- foo = deco1(deco2(foo()))
2. Dekoratoren mit und ohne Parameter
Die Die obigen Beispiele haben grundsätzlich Parameter, und es ist einfacher, keine Parameter zu haben.
1. Keine Parameter
@deco1
@deco2
def foo(arg):pass
----- -
foo = deco1(deco2(foo()))
Sie können
@deco1(deco_arg)
@deco2
def foo(arg):pass
------------- --------
foo = deco1(deco_arg)(deco2(foo()))
Gibt einen Dekorator zurück, der eine Funktion als Parameter akzeptiert
3. Verwendungen
1. Referenzprotokoll
2. Timing-Logik zur Leistungserkennung hinzufügen
3. Beispiele
from time import ctime,sleep def deco(func): def decoIn(): print '[%s]:%s called' %(ctime(),func.__name__) return func return decoIn @deco def foo(): pass foo() sleep(4) for i in range(2): sleep(1) foo() #输出如下:-------- #[Fri Jul 05 10:45:04 2013]:foo called #[Fri Jul 05 10:45:09 2013]:foo called #[Fri Jul 05 10:45:10 2013]:foo called #------------------