装饰器的使用
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
正是江南好风景