在需要对原有函数进行功能扩展需求,需要使用装饰器
import time
def func():
print('hello')
def timmer(f)
start_time=time.time()
f()
stop_time=time.time()
print(stop_time-start_time)
timmer(func)
此时问题在于调用方式发生了变化,原来函数func变成了timmer(func)
1.装饰器雏形
import time
def func():
print('hello')
def timmer(f):
def inner():
start_time=time.time()
f()
stop_time=time.time()
print(stop_time-start_time)
return inner
func = timmer(func)
func()
此时用闭包解决了问题,但是需要多赋值一次
2. 装饰器
import time
def timmer(f):
def inner():
start_time=time.time()
f()
stop_time=time.time()
print(stop_time-start_time)
return inner
@timmer
def func():
print('hello')
func()
3.装饰有参数的函数
import time
def timmer(f):
def inner(a):
start_time=time.time()
f(a)
stop_time=time.time()
print(stop_time-start_time)
return inner
@timmer
def func(a):
print('hello',a)
func('world')
4.装饰有返回值的函数
import time
def timmer(f):
def inner(a):
start_time=time.time()
ret = f(a)
stop_time=time.time()
print(stop_time-start_time)
retrun ret
return inner
@timmer
def func(a):
print('hello',a)
restrn 'hehe'
a=func('world')
5.装饰器万能版
def wrapper(func):
def inner(*args,**kwargs):
'''''装饰前的代码 ''''
ret = func(*args,**kwargs)
'''''装饰后的代码 ''''
return ret
return inner
6. 正常我们情况下查看函数的一些信息的方法在此处都会失效,为了不让他们失效,我们还要在装饰器上加上一点来完善
from functools import wraps
def deco(func):
@wraps(func) #加在最内层函数正上方
def wrapper(*args,**kwargs):
return func(*args,**kwargs)
return wrapper