看个例子:
# 定义装饰器函数 def log(func): """ 接受一个函数作为参数,并返回一个函数 :param func: :return: """ def wrapper(*args,**kwargs): """ :param args: :param kwargs: :return: """ print("call %s():"% func.__name__) return func(*args,**kwargs) return wrapper @log def now(): print(time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())) now()
输出:
call now():
2020-04-04 22:51:23
1、本来now()的功能只是打印时间,现在我们要增强now()功能,在这里我们把这种自己定义的log函数的方式叫做装饰器(decorator)
def now(): print(time.strftime("%Y-%m-%d %H:%M:%S",time.localtime()))
2、本质上装饰器是返回函数的高阶函数,接受一个函数作为参数,并返回一个函数
def log(func): """ 接受一个函数作为参数,并返回一个函数 :param func: :return: """ def wrapper(*args,**kwargs): """ :param args: :param kwargs: :return: """ print("call %s():"% func.__name__) return func(*args,**kwargs) return wrapper
3、借助@语法
log def now(): print(time.strftime("%Y-%m-%d %H:%M:%S",time.localtime()))
运行now():
call now():
2020-04-04 22:51:23
这里相当于执行了now=log(now)
在wrapper函数内,可以接受任意参数的调用,首先打印日志,后面再调用原始的函数
博文参考:https://www.liaoxuefeng.com/wiki/1016959663602400/1017451662295584