一、定义
Decorators是修改其他函数的功能(不改变原函数)的函数。
闭包函数使得局部变量在函数外被访问成为可能,
装饰器:闭包函数的一种应用。
二、两大原则
1、不能修改原函数的源代码
2、不能改变原函数的调用方式
三、目标
增加函数的功能,或分离次要功能以保持函数功能的纯粹单一。
例如为这个阶乘函数增加计算程序运行时间的功能
def fact(n):
if n==1:
return 1
return n * fact(n - 1)
print(fact(50))
装饰器可以这样写
import time
def timer(func):
def deco(*args, **kwargs):
start = time.time()
res = func(*args, **kwargs)
stop = time.time()
print(stop-start)
return res
return deco
@timer
def fact(n):
if n==1:
return 1
return n * fact(n - 1)
print(fact(50))
四、 装饰器模板
def wrapper(func): # 装饰器名
def inner(*args, **kwargs):
print('before') # 在此处增加调用函数前加功能
res = func(*args, **kwargs) # 调用最函数
print('after')# 在此处增加调用函数后加功能
return res
return inner
@wrapper
def 被装饰的函数
装饰器的固定格式wraps版:
from functools import wraps
def deco(func):
@wraps(func) #加在最内层函数正上方
def wrapper(*args,**kwargs):
return func(*args,**kwargs)
return wrapper
装饰器的应用场景:比如授权、插入日志,性能测试,事务处理,缓存等等场景