装饰器函数精讲

阅读目录

 

 

举例函数

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()

 

posted @ 2017-07-28 19:49  妙香沫颜  阅读(174)  评论(0编辑  收藏  举报