python-带能数的装饰器

from functools import wraps

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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

带参数的装饰器  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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')
1
2
3
4
5
@与outter(flag)两部份
第一步:outter(flag)返回给wrapper1
第二步:@wrapper1
两步后语法糖转化为:
wrapper1 = utter(flag)

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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 @   wsg-python  阅读(138)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示