Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte Erklärung der Python-Dekoratoren

Detaillierte Erklärung der Python-Dekoratoren

高洛峰
高洛峰Original
2016-10-19 16:06:361206Durchsuche

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 &#39;deco1&#39;
    return func
def deco2(func):
    print &#39;deco2&#39;
    return func   
@deco1
@deco2
def foo():
    print &#39;foo&#39;
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 &#39;[%s]:%s called&#39; %(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
#------------------

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn