1、作用

利用装饰器,可以在不修改已有函数的情况下向已有函数中注入代码,使其具备新的功能。
 
2、特点
一个装饰器可以为多个函数注入代码,一个函数也可以注入多个装饰器的代码。
 
3、优点
利用装饰器可以将日志处理、执行时间计算等较为通用的代码注入到不同的函数中,从而使得代码更加简洁
 
4、Demo1
 1 def deco1(func): #定义函数deco1 
 2     def inner1(*args, **kwargs): #定义函数inner1 
 3         print('deco1 begin') 
 4         func(*args, **kwargs) 
 5         print('deco1 end') 
 6     return inner1 #返回函数inner1的引用
 7 @deco1 
 8 def f1(a,b): #定义函数f1 
 9     print('a+b=',a+b) 
10 @deco1 
11 @deco2 
12 def f2(a,b,c): #定义函数f2 
13     print('a+b+c=',a+b+c) 
14 if __name__=='__main__': 
15     f1(3,5) #调用f1函数 
16     f2(1,3,5) #调用f2函数
17 print('deco1 begin') 
18 print('a+b=',a+b) 
19 print('deco1 end')
20 print('deco1 begin') 
21 print('deco2 begin') 
22 print('a+b+c=',a+b+c) 
23 print('deco2 end') 
24 print('deco1 end')

输出:

deco1 begin
a+b= 8
deco1 end
deco1 begin
deco2 begin
a+b+c= 9
deco2 end
deco1 end
 
Demo2
 1 def deco1(func): #定义函数deco1 
 2     def inner1(x,y): #定义函数inner1 
 3         print('deco1 begin') 
 4         func(x,y) 
 5         print('deco1 end') 
 6     return inner1 #返回函数inner1的引用 
 7 def deco2(func): #定义函数deco2 
 8     def inner2(): #定义函数inner2 
 9         print('deco2 begin') 
10         func() 
11         print('deco2 end') 
12     return inner2 #返回函数inner2的引用 
13 @deco1 
14  def f1(a,b): #定义函数f1 
15      print('a+b=',a+b) 
16 @deco2 
17 def f2(): #定义函数f2 
18     print('f2 is called') 
19 if __name__=='__main__': 
20     f1(3,5) #调用f1函数 
21     f2() #调用f2函数   
22 print('deco1 begin') 
23 print('a+b=',a+b) 
24 print('deco1 end')  
25 print('deco2 begin') 
26 print('f2 is called') 
27 print('deco2 end')              

注意:deco1只能用于装饰带两个参数的函数,而deco2只能用于装饰没有参数的函数。

输出:deco1 begin

   a+b= 8
   deco1 end
   deco2 begin
   f2 is called
   deco2 end
 
posted on 2020-12-21 17:55  史振兴  阅读(106)  评论(0编辑  收藏  举报