python 装饰器
需要先理解闭包函数
1. 统计 index函数的执行时间
import time
def index():
time.sleep(2)
print('welcome to index')
第一种方式
计算函数开始时间,结束时间
start_time = time.time() index() end_time = time.time() print(end_time - start_time)
此种方式缺点:
① 只能统计index()函数的执行时间,统计其他函数执行时间需要再写一次统计逻辑
第二种方式
第一种方式进阶(解决只能统计固定函数执行时间的缺点)
def timmer(func):
start_time = time.time()
func() # index()
end_time = time.time()
print(end_time - start_time)
timmer(index)
定义timmer函数,将需要统计执行时间的函数作为timmer参数传入
此种方式缺点:改变了index函数的调用方式
第三种方式
闭包函数方式
def timmer(func):
def inner():
start_time = time.time()
func()
end_time = time.time()
print(end_time - start_time)
return inner
index = timmer(index)
index() #inner()
继续进阶 优化第三种方式
import time
def timmer(func):
def inner():
start_time = time.time()
func()
end_time = time.time()
print(end_time - start_time)
return inner
@timmer
#index = timmer(index) #python解释器遇到@符号,
# 就会把其下方函数当做参数传给timmer(index)
def index():
time.sleep(2)
print('welcome to index')
index() #inner()
↑ 当index函数有返回值时无法获取
@timmer
def index(): time.sleep(2) print('welcome to index') return 1111
res = index() #获取的是inner函数的返回值,而此时inner没有返回值
print(res)
修改inner函数接收返回值
import time
def timmer(func):
def inner():
start_time = time.time()
res = func() #修改
end_time = time.time()
print(end_time - start_time)
return res #修改
return inner
@timmer
def index():
time.sleep(2)
print('welcome to index')
return 1111
res = index() #inner()
print(res)
index函数会有参数,继续修改
import time
def timmer(func):
def inner(*args,**kwargs): #修改点 将接收到的参数传给func
start_time = time.time()
res = func(*args,**kwargs) #修改点
end_time = time.time()
print(end_time - start_time)
return res
return inner
@timmer
def index(name):
time.sleep(2)
print('welcome %s to index' % name)
return 1111
res = index('xiaoming') #inner('xiaoming')
print(res)
以上,便实现了一个无参装饰器

浙公网安备 33010602011771号