1、@waps
保证被装饰函数所有的属性保持不变
from functools import wraps def wrapper(func): @wraps(func) def inner(*args,**kwargs): print('在被装饰的函数执行之前做的事') ret = func(*args,**kwargs) print('在被装饰的函数执行之后做的事') return ret return inner @wrapper def holiday(day): '''This is a holiday notice''' print('元旦放假剩余%d天'%day) return('好开心噻!') ret = holiday(3) print(ret) print(holiday.__name__) print(holiday.__doc__)
2、带参数的装饰器
常用于批量处理装饰器函数的应用与否
import time flage = True def wrapper_out(flag): def wrapper(func): def inner(*args,**kwargs): if flag: start = time.time() ret = func(*args,**kwargs) end = time.time() print(end - start) return ret else: ret = func(*args, **kwargs) return ret return inner return wrapper @wrapper_out(flage) def wahaha(): time.sleep(0.1) print('哇哈哈!') @wrapper_out(flage) def qqxing(): time.sleep(0.1) print('QQ星!') wahaha = wahaha() print(wahaha) qqxing = qqxing() print(qqxing)
3、多个装饰器装饰同一个函数
俄罗斯套娃
def wrapper1(func): def inner(*args,**kwargs): print('wrapper1函数装饰被装饰函数之前的函数') ret = func(*args,**kwargs) print('wrapper1函数装饰被装饰函数之后的函数') return ret return inner def wrapper2(func): def inner(*args,**kwargs): print('wrapper2函数装饰被装饰函数之前的函数') ret = func(*args,**kwargs) print('wrapper2函数装饰被装饰函数之后的函数') return ret return inner @wrapper2 @wrapper1 def func(): print('被执行的函数') return('小混蛋骂谁?') ret = func() print(ret)