装饰器的作用:
在不改变原函数的基础上,添加其他功能
## 固定模式:
def wrapper(func):
def inner(*args, **kwargs):
'''执行被装饰的函数前做的事'''
ret = func(*args, **kwargs)
'''执行被装饰的函数后做的事'''
return ret
return inner
@wrapper
def func(a):
print('Hello!',a)
return '欢迎'
ret = func(‘梵谷’)
print(ret)
## 带一个参数的装饰器:
import time
flag = False
def wrapper_out(flag):
def wrapper(func):
def inner(*args, **kwargs):
if flag:
star = time.time()
ret = func(*args, **kwargs)
end = time.time()
print(end - star)
return ret
else:
ret = func(*args, **kwargs)
return ret
return inner
return wrapper
@wrapper_out(flag)
def fancoo():
time.sleep(0.1)
print('你好!')
@wrapper_out(flag)
def famcoo():
time.sleep(0.2)
print('再见!')
fancoo()
famcoo()
## 多个装饰器装饰一个函数
def wrapper1(func):
def inner1():
print('wrapper1 ,before func')
ret = func()
print('wrapper1 ,after func')
return ret
return inner1
def wrapper2(func):
def inner2():
print('wrapper2 ,before func')
ret = func()
print('wrapper2 ,after func')
return ret
return inner2
def wrapper3(func):
def inner3():
print('wrapper3 ,before func')
ret = func()
print('wrapper3 ,after func')
return ret
return inner3
@wrapper3
@wrapper2
@wrapper1
def f():
print('in f')
return '哈哈哈'
print(f())
结果是:3,2,1,f(),1,2,3
## 番外
from functools import wraps
def wrapper(func): #func = holiday
@wraps(func)
def inner(*args,**kwargs):
print('在被装饰的函数执行之前做的事')
ret = func(*args,**kwargs)
print('在被装饰的函数执行之后做的事')
return ret
return inner
@wrapper #holiday = wrapper(holiday)
def holiday(day):
'''这是一个放假通知'''
print('全体放假%s天'%day)
return '好开心'
print(holiday.__name__)
print(holiday.__doc__)
ret = holiday(3) #inner
print(ret)