装饰器函数精讲

Posted 妙香沫颜

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了装饰器函数精讲相关的知识,希望对你有一定的参考价值。

阅读目录

 

 

举例函数

import time
def timer(func):
    def inner():
        start = time.time()
        func()
        print(time.time() - start)
    return inner

@timer   #==> func1 = timer(func1)
def func1():
time.sleep(0.1)
print(\'in func1\') func1()

 

in func1
0.10062646865844727
View Code

装饰器的本质:一个闭包函数

装饰器的功能:在不修改原函数及其调用方式的情况下对原函数功能进行扩展

 

装饰一个带参数的函数

def timer(func):
    def inner(a):
        start = time.time()
        func(a)
        print(time.time() - start)
    return inner

@timer
def func1(a):
    print(a)

func1(1)

1
0.0
View Code

两个函数,需要传递的参数不一样

import time
def timer(func):
    def inner(*args,**kwargs):
        start = time.time()
        re = func(*args,**kwargs)
        print(time.time() - start)
        return re
    return inner

@timer   #==> func1 = timer(func1)
def func1(a,b):
    print(\'in func1\')

@timer   #==> func2 = timer(func2)
def func2(a):
    print(\'in func2 and get a:%s\'%(a))
    return \'fun2 over\'

func1(\'aaaaaa\',\'bbbbbb\')
print(func2(\'aaaaaa\'))
ni shi sb
0.10007596015930176
in func1
0.0
in func2 and get a:aaaaaa
0.0
fun2 over
View Code

装饰器的固定格式:

def timer(func):
    def inner(*args,**kwargs):
        \'\'\'执行函数之前要做的\'\'\'
        re = func(*args,**kwargs)
        \'\'\'执行函数之后要做的\'\'\'
        return re
    return inner

带参数的装饰器

1 def outer(flag):
    3 def timer(func):
        5 def inner(*args,**kwargs):
            8 if flag:
                print(\'\'\'执行函数之前要做的\'\'\')
            9 re = func(*args,**kwargs)
            11 if flag:
                print(\'\'\'执行函数之后要做的\'\'\')
            12 return re
        6 return inner
    4 return timer

2 @outer(False)
def func():
    10 print(111)

7 func()

 

111
View Code

多个装饰器装饰同一个函数

def wrapper1(func):
    def inner():
        print(\'wrapper1 ,before func\')
        func()
        print(\'wrapper1 ,after func\')
    return inner

def wrapper2(func):
    def inner():
        print(\'wrapper2 ,before func\')
        func()
        print(\'wrapper2 ,after func\')
    return inner

@wrapper2
@wrapper1
def f():
    print(\'in f\')

f()

 

以上是关于装饰器函数精讲的主要内容,如果未能解决你的问题,请参考以下文章

Python面向对象学习之八,装饰器

装饰器181029

python 装饰器

闭包函数,装饰器

[TimLinux] Python 装饰器

python装饰器