装饰器的使用

 1 #使用装饰器 完成不修改func1() func2()函数的源码,添加输出日志信息\
 2 import time 
 3 def func1():
 4     print('功能1')
 5 def func2():
 6     print('功能2')
 7 def writelog(func):
 8     try:
 9         file = open('log.txt','a',encoding='utf-8')
10         file.write('访问:')
11         file.write(func.__name__)
12         file.write('\t')
13         file.write('时间:')
14         file.write(time.asctime())
15         file.write('\n')
16     except Exception as e:
17         print(e.args)
18     finally:
19         file.close()
20 
21 #使用闭包
22 def funcOut(func):
23     def funcIn():
24         writelog(func) #内部函数使用外部函数的变量
25         func()
26     return funcIn #外部函数返回内部函数的函数名
27 
28 #闭包的调用
29 func1 = funcOut(func1) #调用外部函数,用一个变量接收返回的内部函数名
30 """
31 分析:左边 func1 变量(可以是其他变量名)  指向参数为func1的外部函数的返回值,
32       也就是指向外部函数返回的内部函数的函数名
33       此时,左边func1 和 funcIn 均指向内部函数。
34 """
35 
36 #装饰器
37 @funcOut #相当于 func1 = funcOut(func1),由此可见,装饰简化实现闭包的功能
38 def func1(): # 将func1作为外部函数funcOut()的参数
39     print('功能1')
40 
41 @funcOut # 装饰器的作用:简化闭包的调用
42 def func2():
43     print('功能2')
44 
45 func1() #用装饰器后,func1直接调用funcOut().并直接以func1作为参数执行内部函数
46 func2()
47 
48 """
49 总结:装饰器:将其下的函数名 func1 作为外部函数的变量参数运行,内部函数又使用
50       外部函数的变量 func1 ,会执行:writelog(func1),func1()
51 """
1 功能1
2 功能2
1 访问:func1    时间:Sat May 16 17:49:21 2020
2 访问:func1    时间:Sat May 16 17:50:18 2020
3 访问:func1    时间:Sat May 16 18:05:37 2020
4 访问:func1    时间:Sat May 16 18:07:18 2020
5 访问:func2    时间:Sat May 16 18:07:18 2020
6 访问:func1    时间:Sat May 16 18:16:50 2020
7 访问:func2    时间:Sat May 16 18:16:50 2020

 

posted @ 2020-05-16 18:23  小他_W  阅读(147)  评论(0编辑  收藏  举报