面试题答案
一键面试import time
import logging
# 配置日志
logging.basicConfig(filename='error.log', level=logging.ERROR)
def log_time_and_error(func):
def wrapper(*args, **kwargs):
start_time = time.time()
print(f"开始时间: {time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(start_time))}")
try:
result = func(*args, **kwargs)
except Exception as e:
logging.error(f"函数 {func.__name__} 发生异常: {str(e)}")
raise
end_time = time.time()
print(f"结束时间: {time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(end_time))}")
return result
return wrapper
@log_time_and_error
def add(a, b):
return a + b
闭包在这个装饰器实现中的关键作用在于:
- 保存状态:装饰器函数
log_time_and_error
返回的内部函数wrapper
记住了外部函数log_time_and_error
的参数func
。这使得wrapper
函数在被调用时,能够调用原来的add
函数,同时执行额外的时间记录和异常处理逻辑。如果没有闭包,wrapper
函数就无法直接访问到func
这个外部函数的局部变量。 - 封装性:闭包将额外的功能(时间记录和异常处理)与原函数
add
封装在一起,使得原函数不需要关心这些额外逻辑,实现了功能的分离和代码的简洁性。