wapers方法
def wahaha(): ''' sljfldsjflds :return: ''' print('娃哈哈') print(wahaha.__name__) #查看字符串格式的函数名
from functools import wraps def wrapper(func): #func = login @wraps(func) def innner(*args,**kwargs): print('在被装饰的函数执行前做的事') ret = func(*args,**kwargs) print('在被装饰的函数执行后做的事') return ret return innner @wrapper #login = wrapper(login) def login(day): '''这是一个放假通知''' print('全体放假%s'%day) return '好开心' print(login.__name__) print(login.__doc__) ret = login(3) #inner print(ret)
login
这是一个放假通知
在被装饰的函数执行前做的事
全体放假3
在被装饰的函数执行后做的事
好开心
装饰器进阶_带参数的装饰器
import time FLAG = True def timmer_out(FLAG): def timmer(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 timmer @timmer_out(FLAG) def wahaha(): time.sleep(0.1) print('hahahahahaha') #@timer = timer_out(FLAG) @timmer_out(FLAG) def erguotou(): time.sleep(0.2) print('erguotoutotutou') wahaha() erguotou()
hahahahahaha
0.1000058650970459
erguotoutotutou
0.2000112533569336
import time FLAG = False def timmer_out(FLAG): def timmer(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 timmer @timmer_out(FLAG) def wahaha(): time.sleep(0.1) print('hahahahahaha') #@timer = timer_out(FLAG) @timmer_out(FLAG) def erguotou(): time.sleep(0.2) print('erguotoutotutou') wahaha() erguotou() hahahahahaha erguotoutotutou
#多个装饰器装饰一个函数
def wrapper1(func): def innner1(*args,**kwargs): print('wrapper,before func') func() print('wrapper,after func') return innner1 def wrapper2(func): def innner2(*args,**kwargs): print('wrapper,before func') func() print('wrapper,after func') return innner2 @wrapper2 @wrapper1 def f(): print('##########333') f() wrapper,before func wrapper,before func ##########333 wrapper,after func wrapper,after func
####################################
from functools import wraps
def wrapper1(func): #func --->f
def innner1(*args,**kwargs):
print('wrapper1,before func')
func() #f
print('wrapper1,after func')
return innner1
def wrapper2(func): #func --->inner1
def innner2(*args,**kwargs):
print('wrapper2,before func')
func() #inner1
print('wrapper2,after func')
return innner2
@wrapper2 #f=wrapper2(f) === wrapper(inner1) ===inner2
@wrapper1 #f=wrapper1(f) ==inner1 函数最近的装饰器先执行
def f():
print('##########333')
f() #-----》inner2()
三层嵌套
from functools import wraps def wrapper1(func): #func --->f def innner1(*args,**kwargs): print('wrapper1,before func') func() #f print('wrapper1,after func') return innner1 def wrapper2(func): #func --->inner1 def innner2(*args,**kwargs): print('wrapper2,before func') func() #inner1 print('wrapper2,after func') return innner2 def wrapper3(func): #func --->inner1 def innner3(*args,**kwargs): print('wrapper3,before func') func() #inner1 print('wrapper3,after func') return innner3 @wrapper3 @wrapper2 #f=wrapper2(f) === wrapper(inner1) ===inner2 @wrapper1 #f=wrapper1(f) ==inner1 函数最近的装饰器先执行 def f(): print('##########333') f() #-----》inner2() wrapper3,before func wrapper2,before func wrapper1,before func ##########333 wrapper1,after func wrapper2,after func wrapper3,after func
带返回值的多装饰器装饰函数
def wrapper1(func): #func --->f def innner1(*args,**kwargs): print('wrapper1,before func') ret = func() #f print('wrapper1,after func') return ret return innner1 def wrapper2(func): #func --->inner1 def innner2(*args,**kwargs): print('wrapper2,before func') ret = func() #inner1 print('wrapper2,after func') return ret return innner2 def wrapper3(func): #func --->inner1 def innner3(*args,**kwargs): print('wrapper3,before func') ret = func() #inner1 print('wrapper3,after func') return ret return innner3 @wrapper3 @wrapper2 #f=wrapper2(f) === wrapper(inner1) ===inner2 @wrapper1 #f=wrapper1(f) ==inner1 函数最近的装饰器先执行 def f(): print('##########333') return 'hahahah' print(f()) #-----》inner2()
wrapper3,before func
wrapper2,before func
wrapper1,before func
##########333
wrapper1,after func
wrapper2,after func
wrapper3,after func
hahahah