一、装饰器原则
二、装饰所用到的知识点
- 函数即变量:
- 函数定义可以同样理解为变量定义,函数名即为变量名;
- 当将直接调用函数名时,函数并没有被执行,而是将函数体传递出去;
- 当函数名加上”()”时,函数才真正被执行。
"""
举个例子,当函数名info赋予f后,相当于将info函数的内存地址告知f;
当f被执行时,执行的是info内存地址中函数体。
"""
def info()#定义一个输出函数
print("123")
f=info # 将函数名赋给变量f
f() # 加上()后的f可以执行函数
'''
>>>123
'''
- 高阶函数:满足下列任意条件即为高阶函数
- 嵌套函数
三、装饰器函数
- 二层简单装饰器
先来看一段程序
import time
def timer(func):
def wrapper(*args,**kwargs):
start_time=time.time()
res=func(*args,**kwargs)
stop_time=time.time()
print("程序执行所用时间为%s"%(stop_time-start_time))
return res
return wrapper
@timer
def text(info):
time.sleep(2)
print(info)
return info
a=text("你好,世界")
print("返回值:%s"%a)
'''
>>>你好,世界
>>>程序执行所用时间为2.004257917404175
>>>返回值:你好,世界
'''
程序解析
- 当text函数被施加了装饰器timer时,
@timer
相当于text=timer(text)
; - text被装饰后,其函数体已经被装饰函数第一层以返回值的方式,替换成了二层函数wrapper
- 这时text已经不是原来的text函数,它已经被wrapper包装并替代了,text纯属山寨(可以通过函数名的地址查看)
- 如果想让text从山寨变成高仿(它已经不是从前的它了),可以在二层wrapper函数前加上
@functools.wraps(func)
,把整个被装饰函数的其它属性复制下来。@functools.wraps(func)
方法需要导入模块:import functools
- 装饰器工作流程图: