'''
闭包的特殊用途:
可以在不修改现有功能源码的前提下,增加新的功能
日志功能(统计访问事件,访问功能,写到日志文件中),权限验证(下载之前,验证当前账户是否为会员)
'''
import time
def write_log(func): # 定义一个记录日志的函数:将访问事件以及访问的函数名写入到文件中(log.txt)
try:
file = open('log.txt', 'a', encoding='utf-8')
file.write(func.__name__) # 写入函数名
file.write('\t')
file.write(time.asctime()) # 写入时间
# time.asctime([t])转换由 gmtime()或localtime()所返回的表示时间的元组或struct_time为以下形式的字符串:
# ‘Sun Jun 20 23:21:05 1993’。
# 如果未提供t,则会使用localtime()所返回的当前时间。
file.write('\n')
except Exception as e:
print(e)
finally:
file.close()
def func_out(func): # 定义闭包函数。外部函数变量为func
def func_in(*args, **kwargs): # 内部函数中调用写入日志的函数。使用带*的可变参数,灵活传递参数。”args”是个元组,’kwargs’是个字典
# 新增日志功能
write_log(func) # 调用外部函数的变量
func(*args, **kwargs)
return func_in # 返回内部函数名,注意无括号。有括号表示返回值,无括号表示函数
@ func_out
def func1():
print('功能1,无参数')
@ func_out
def func2(a):
print(f'功能2,有一个参数:{a}')
@ func_out
def func3(a, b):
print(f'功能3,有两个参数:{a}和{b}')
func1()
func2('李焕英')
func3('晴明', '博雅')