'''
装饰器作用:<用来装饰其他函数的,即为其他函数添加特定功能的函数>
装饰器函数的两个基本原则:
1.装饰器不能修改被装饰函数的源码
2.装饰器不能修改被装饰困数的调用方式
关于第二点的说明:
@timer 等效于foo=timer(foo),事实上返回的是嵌套函数的view(引用):timer_calc
但接受的名称记为foo,就是符合第二点,不能改变被装饰函数的调用方式
3.如果不用语法糖@timer,调用方式如下:
foo=timer(foo) --> @timer
foo()
'''
'''
装饰器基本步骤:
1.定义一个接受函数名作为参数的高阶函数
2.在高阶函数中定义一个嵌套函数,在该嵌套函数中封装想要添加的功能代码
3.调用作为参数传入的函数名
4.返回嵌套函数的函数名
'''
# (1)被装饰函数带有参数或不带参数
def deco(func):
def inner(*args,**kwargs):
# 包含所有的附加功能
func(*args,**kwargs)
return inner
'''
eg.
0. 装饰器就是在运行被装饰函数的基础添加<特定的功能>
1. foo("MMiL",18) -> 等效于调用嵌套函数timer_calc("MMiL",18) <- foo=timeer(foo)
在嵌套函数里面调用被装饰的函数func(name,age)
2. 为了增加通用性,不同的被装饰函数输入参数都不一样,考虑到自适应性
装饰器嵌套函数应该*args,**kwargs
'''
# (2)装饰器本身带参数
def deco(param): # param是装饰器本身的参数
def outer(func): # 是已被装饰的函数名作为参数 -> 语法糖
def inner(*args,**kwargs):
# 包含所有的附加功能
func(*args,**kwargs)
return inner
return outer
'''
eg.
1. @timer(timer_type="timer_by_minute") 等效于:foo=timer(timer_type="timer_by_minute")(foo);
链式传参; timer(timer_type="timer_by_minute")返回的是outer函数引用,在传入outer(foo)-->返回嵌套函数inner引用-->foo
2. 深刻理解return outer,return inner, 返回嵌套函数引用 & 嵌套函数里面的链式调用
'''
# (3)被装饰函数带返回值
def deco(param): # param是装饰器本身的参数
def outer(func): # 是已被装饰的函数名作为参数 -> 语法糖
def inner(*args,**kwargs):
# 包含所有的附加功能
result=func(*args,**kwargs) # 接收到被修饰函数的返回值
return result # 返回被修饰函数的返回值
return inner
return outer
标签:总结,return,函数,timer,inner,foo,装饰,入门
From: https://blog.csdn.net/iLfree/article/details/143268028