初识装饰器

装饰器:不想修改函数的调用方式,但还是想在原来的函数前后添加功能。遵循开放封闭原则。(闭包)

上图,运行过程详解。

 

 

 修饰器固定格式:

1 def wrapper(f):#装饰器函数------wrapper()
2     def inner(*args,**kwargs):
3         ret = f(*args,**kwargs)#被装饰的函数-------f()
4         return ret
5     return inner

 语法糖:

@装饰器函数

 

1 @wrapper        #qqxing = wrapper(qqxing)
2 def qqxing():
3     print(123)

 

#多个装饰器修饰一个函数

 1 #两个装饰器装饰一个函数,下附运行过程图
 2 def wrapper1(func):
 3     def inner1():
 4         print('wrapper1 ,before func')
 5         ret = func()
 6         print('wrapper1 ,after func')
 7         return ret
 8     return inner1
 9 
10 def wrapper2(func):
11     def inner2():
12         print('wrapper2 ,before func')
13         ret = func()
14         print('wrapper2 ,after func')
15         return ret
16     return inner2
17 
18 
19 @wrapper2
20 @wrapper1
21 def f():
22     print('in f')
23     return '哈哈哈'
个装饰器

 

 

 1 #多个装饰器装饰一个函数
 2 def wrapper1(func):
 3     def inner1():
 4         print('wrapper1 ,before func')
 5         ret = func()
 6         print('wrapper1 ,after func')
 7         return ret
 8     return inner1
 9 
10 def wrapper2(func):
11     def inner2():
12         print('wrapper2 ,before func')
13         ret = func()
14         print('wrapper2 ,after func')
15         return ret
16     return inner2
17 
18 def wrapper3(func):
19     def inner3():
20         print('wrapper3 ,before func')
21         ret = func()
22         print('wrapper3 ,after func')
23         return ret
24     return inner3
25 
26 @wrapper3
27 @wrapper2
28 @wrapper1
29 def f():
30     print('in f')
31     return '哈哈哈'
32 
33 print(f())

英文版:https://dzone.com/articles/understanding-python%20

posted @ 2017-12-28 12:01  Carol-z  阅读(147)  评论(0编辑  收藏  举报