装饰器的进阶
from functools import wraps #functools.wraps 防止一些函数返回值失效
def wrapper(func):
@wraps(func) #加在最内层函数正上方
def inner():
'''执行函数之前要做的'''
ret =func(*args,**kwargs)
'''执行函数之后要做的'''
return ret
return inner
@wrapper
def holiday(day):
'''这是一个放假通知'''
print('全体放假$s天'%day)
return '好开心'
print(holiday.__name__)
print(holiday.__doc__)
ret = holiday(3)
print(ret)
带参数的装饰器
#多层装饰器
import time #模块调用
FLAGE = True # FLAGE = Flase
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(FLAGE)
def wahaha():
time.time(0.1)
print('wahahahahahaha')
@timmer_out(FLAGE)
def niuniu():
time.sleep(0.1)
print('niuniuniubility')
wahaha()
niuniu()
三层装饰器
def wrapper1(func): #func-->f
def inner():
print('wrapper1 ,before func')
func() #f()
print('wrapper1 ,after func')
return inner
def wrapper2(func): #func-->inner
def inner():
print('wrapper2 ,before func')
func() #inner1()
print('wrapper2 ,after func')
return inner
@wrapper2 #f = wrapper2(f) = wrapper2(inner1) = inner2
@wrapper1 #f = wrapper1(f) = inner
def f():
print('in f')
f() inner2()