文章目录
装饰器
装饰器,见名知意,“装饰”表示为被装饰对象添加新的功能,“器”则表示是一个工具,它不是一个新的知识,而是“函数嵌套+闭包+函数对象“等内容进行组合使用的产物,目的是为了在不改变原有函数代码内容和调用方式的基础上,新增额外的功能。例如认证功能,在很多地方都需要使用,有了装饰器,就可以节省很多代码,使其在很多地方能够重复使用。
装饰器的核心思想:
- 不改变原有函数的代码;
- 不改变原函数的调用方式;
- 在满足以上两个条件下,增加额外的功能。
引例:给index函数统计执行时间
储备知识:
time模块
时间戳:表示执行的这一刻距离1970年一月一日的总秒数
time.time()
原地等待:
time.sleep(3) # 表示等待三秒
import time
def index():
time.sleep(3)
print('from index')
# 1. 在函数执行之前打印一个时间节点
start_time = time.time()
index()
# 2. 等待函数执行完毕之后,在打印一个时间节点
end_time = time.time()
# 3. 总的执行时间就是两个的差值
print(end_time - start_time)
装饰器的简易版本
在上面引例中,虽然实现了统计index函数执行时间的功能,但是如果需要统计别的函数的执行时间时,就需要重复写同样的代码,这样很不方便,因此我们通过装饰器来实现此功能。
代码实现:
import time
def index():
time.sleep(2)
print('from index')
def outer():
func = index
def get_time():
# 1. 统计一下函数执行前的时间戳
start_time = time.time()
func()
# 2. 统计一下函数执行完之后的时间戳
end_time = time.time()
# 3. 计算差值
print('函数执行时间:%s' % (end_time - start_time))
return get_time
index = outer()
index()
以上代码通过装饰器的方式实现了统计函数index的执行时间,但是被统计的函数已经固定了,为了让它通用,变成“器”,我们采用传参的方式将被装饰的函数传入,因此有了下面的结果:
import time
def index():
time.sleep(2)
print('from index')
def home():
time.sleep(3)
print('from home')
def outer(func):
def get_time():
# 1. 统计一下函数执行前的时间戳
start_time = time.time()
func()
# 2. 统计一下函数执行完之后的时间戳
end_time = time.time()
# 3. 计算差值
print('函数执行时间:%s' % (end_time - start_time))
return get_time
index = outer