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(' ')
13 file.write('时间:')
14 file.write(time.asctime())
15 file.write('
')
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 访问: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