python-带能数的装饰器

from functools import wraps

from functools import wraps               #引入一行
def wrapper(func_1):
    @wraps(func_1)                             #加入一行
    def inner(*args,**kwargs):
        ret = func_1(*args,**kwargs)
        return ret
    return inner

@wrapper    
def func_1(a):
    print('来呀'+a)
    return
# func_1 = wrapper(func_1)
func_1('c')
print(func_1.__name__)
如果不引入wraps,不加@wraps(func_1)时打印下面话打印出
$inner
加上引入,加@时打印
$func_1

带参数的装饰器  

flag = True
def outter(flag):
    def wrapper1(func_1):
        def inner(*args,**kwargs):
            if flag :
                print('func_1 begin')
                ret = func_1(*args,**kwargs)
                print('func_1 end')
                return ret
            ret = func_1(*args,**kwargs)
            return ret
        return inner
    return wrapper1


@outter(flag)   # func_1 = wrapper(func_1)
def func_1(a):
    print('来呀'+a)
    return


@outter(flag)   # func_1 = wrapper(func_1)
def func_2(a):
    print('来呀'+a)
    return

func_1('func_1')
func_2('func_2')
@与outter(flag)两部份
第一步:outter(flag)返回给wrapper1
第二步:@wrapper1
两步后语法糖转化为:
wrapper1 = utter(flag)

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

def wrapper1(func_1):
    def inner(*args,**kwargs):
        print('func_1 begin')
        ret = func_1(*args,**kwargs)
        print('func_1 end')
        return ret
    return inner

def wrapper2(func_1):
    def inner(*args,**kwargs):
        print('func_2 begin')
        ret = func_1(*args,**kwargs)
        print('func_2 end')
        return ret
    return inner
@wrapper2
@wrapper1   # func_1 = wrapper(func_1)
def func_1(a):
    print('来呀'+a)
    return  '哈哈'
func_1('c')


$func_2 begin
$func_1 begin
$来呀c
$func_1 end
$func_2 end
'哈哈'

  

posted @ 2017-12-29 15:51  wsg-python  阅读(138)  评论(0编辑  收藏  举报