装饰器是一个函数
装饰器具有一个功能。
装饰器像给其他函数穿外套:今天穿"日志外套",明天换"缓存外套",业务本体不动分毫。这就是"**非侵入式扩展"**的威力。
一个例子
日志记录功能的装饰器
python
import functools
import time
def log_call(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
ts = time.strftime("%Y-%m-%d %H:%M:%S")
print(f"[{ts}] CALL {func.__name__} args={args} kwargs={kwargs}")
result = func(*args, **kwargs)
print(f"[{ts}] RET {func.__name__} -> {result}")
return result
return wrapper
@log_call
def add(a, b):
return a + b
add(3,5)

Q:从数学复合函数角度,如何理解装饰器的闭包?
- 内层函数是被包装的函数,是被调用的函数
- 外层函数是装饰器
程序是记忆外部(提供参数),执行内部(本质逻辑)
其实和数学复合函数不一样。
复合函数是有buff叠加,而装饰器是在保有原效果基础上增添新功能(装饰器的功能)
就是房子刷漆,变漂亮了。