装饰器浅谈

1,单层装饰器

def timer(func):
    def init(*args,**kwargs):
        func()
    return init

@timer #func = timer(func) def func(
*args,**kwargs): print('is here') func()

2,多层装饰器

def before(func):
    def init2(*args,**kwargs):
        print(111)
        func()
        print(5555)
    return init2

def after(func):
    def init1(*args,**kwargs):
        print(2222)
        func()
        print(4444)
    return init1

@before
@after           #多层装饰器由外层装饰器包含内部装饰器    mid=before(after(mid))
def mid(*args,**kwargs):
    print(333)

mid()

===>
111
222
333
444
555

#打印结果的顺序和调用顺序刚好相反。
函数的调用顺序
1,
after(mid) 先执行最里面的after return init1函数
2,before(init1) 再次执行before函数 return init2
3, 执行func() 因为函数func已经等于init2 ,所以打印111
4,执行before里面的func() 因为前面before(init1)已经把func变成init1,所以变相的执行init1()
5,执行init1() 打印2222
6,执行after里面的func() 因为开始after(mid) 把mid函数穿进去了,所以执行mid()
7,mid() 打印333
8,执行完mid() 继续执行print(444)
9,在打印444和5555

 3,带参数的装饰器:根据传的参数,后面进行其他逻辑操作

 3 F=False#为False时就把装饰器给去掉了
 4 def outer(flag):
 5     def wrapper(func):
 6         def inner(*args,**kwargs):
 7             if flag:
 8                 print('before')
 9                 ret=func(*args,**kwargs)
10                 print('after')
11             else:
12                 ret = func(*args, **kwargs)
13             return ret
14         return inner
15     return wrapper
16 
17 @outer(F)#@wrapper
18 def hahaha():
19     print('hahaha')
20 
21 @outer(F)
22 def shuangwaiwai():
23     print('shuangwaiwai')
24 
25 hahaha()
26 shuangwaiwai()

 

posted @ 2018-10-22 18:07  forjie  阅读(162)  评论(0编辑  收藏  举报