码迷,mamicode.com
首页 > 其他好文 > 详细

装饰器函数精讲

时间:2017-07-28 20:58:40      阅读:223      评论:0      收藏:0      [点我收藏+]

标签:lag   nbsp   one   参数   bbb   strong   闭包   格式   time   

阅读目录

 

 

举例函数

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

 

装饰器函数精讲

标签:lag   nbsp   one   参数   bbb   strong   闭包   格式   time   

原文地址:http://www.cnblogs.com/liuchengdong/p/7252336.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!