Home  >  Article  >  Backend Development  >  Detailed explanation of python decorators

Detailed explanation of python decorators

高洛峰
高洛峰Original
2016-10-19 16:06:361174browse

The syntax of the decorator starts with @, followed by the name of the decorator function and optional parameters.

Following the decorator declaration are the decorated function and the optional parameters of the decorated function, as follows:

@decorator(dec_opt_args)

def func(func_args):

....

In fact, overall Speaking of which, a decorator is actually a function, a function used to wrap a function. The decorator is called when the function declaration is completed, and the function declared after the call is replaced by a function decorated by the decorator.

For example:

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
#------------------

If you don’t use decorators, you can do the following:

def deco1(func):
    print 'ok'
    return func
def foo():
    print 'foo'
print foo           #<function foo at 0x00AFE6F0>
foo = deco1(foo)   
foo()
#输出--------------
#ok
#foo
#------------------

Comparing the two, you can see that using decorators is so simple and flexible. Especially in enterprise-level development.

You can also use multiple decorators overlappingly:

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
#---------------------

Equivalent to:

@deco1
@deco2
def foo(arg):pass
-----------与下等效----------
foo = deco1(deco2(foo()))

2. Decorators with and without parameters

The above examples basically have parameters, and no parameters are simpler .

1. No ginseng

@deco1

@deco2

def foo(arg):pass

------------------------

foo = deco1(deco2(foo()))

2, there are ginseng

@deco1(deco_arg)

@deco2

def foo(arg):pass

---------- ----------

foo = deco1(deco_arg)(deco2(foo()))

Returns a decorator that takes a function as a parameter

3. Uses

1. Reference log

2 , Add timing logic to test performance

3. The ability to add transactions to functions

4. Example

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
#------------------


Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn