装饰器
例子一:
1 import time 2 def timer(func): 3 def inner(): 4 ret = func() #3、此处执行func1(),打印func1 5 print(time.time()) #4、打印当前时间 6 return ret #5、返回func1的返回值 7 return inner 8 9 @timer #1、此处执行 func1 = timer(func1) ,相当于func1 = inner 10 def func1(): 11 print('func1') 12 return 'fun1 return' 13 print(func1()) #2、此处执行func1()=执行inner() 6、接收返回值并进行打印 14 15 @timer 16 def func2(): 17 print('func2') 18 func2()
以上执行结果:
1 func1 2 1548158473.1767523 3 fun1 return 4 func2 5 1548158473.1767523
例子二: 内部函数可以接收多个值
1 def download(func): 2 def inner(*args, **kwargs): 3 print('下载软件') 4 ret = func(*args, **kwargs) #此处可接受多个值 5 return ret 6 return inner 7 8 @download #1、此处相当于执行 yue = download(yue) 9 def yue(tool): 10 print("用{}传消息".format(tool)) 11 12 yue('QQ') # 2、此处执行inner 13 yue('微信') 14 yue('FTP')
执行结果:
1 下载软件 2 用QQ传消息 3 下载软件 4 用微信传消息 5 下载软件 6 用FTP传消息
例子三:接收多个参数的装饰器
1 import time 2 flag = True 3 def outer(flag): 4 def timer(func): 5 def inner(*args, **kwargs): 6 ret = func(*args, **kwargs) #打印func1 7 if flag: 8 print(time.time()) 9 return ret 10 return inner 11 return timer 12 13 @outer(True) # func1 = outer(True)(func1) #@outer(True) == @timer 相当于 func1 = timer(func1) inner 14 def func1(): 15 print('func1') 16 func1() # 相当于执行timer
例子四: 一个函数利用多个装饰器
1 def wrapper1(func): 2 def inner(*args, **kwargs): 3 print('wrapper1 前') #6、直接打印 4 ret = func(*args, **kwargs) #7、执行func1中的 打印出func1 5 print('wrapper1 后') #8 直接打印 6 return ret 7 return inner # 2、把inner返回给func1 8 9 def wrapper2(func): 10 def inner(*args, **kwargs): 11 print('wrapper2 前') #4、直接打印 12 ret = func(*args, **kwargs) #5、执行wrapper1中inner 13 print('wrapper2 后') #9直接打印 14 return ret 15 return inner 16 17 @wrapper2 #2、相当于执行func1 = wrapper2(func) wrapper2.inner #此时传的func是经过wrapper1装饰的 18 @wrapper1 #1、相当于执行func1 = wrapper1(func1) wrapper1.inner 19 def func1(): 20 print('func1') 21 func1() #3、此刻先执行wrapper2 中的inner
例子五: 显示函数原有的名字
1 from functools import wraps 2 def w1(func): 3 @wraps(func) #相当于把每一个传进来的函数的名字进行还原/ 还能显示函数的本质 4 def inner(*args, **kwargs): 5 print('wrapper1 前') 6 ret = func(*args, **kwargs) 7 print('wrapper1 后') 8 return ret 9 return inner 10 11 @w1 12 def func1(): 13 """ 14 xxxxxxxx 15 :return: 16 """ 17 print('func1') 18 19 @w1 20 def func2(): 21 print('func2') 22 23 print(func1.__doc__) #打印出函数体内注释的内容 24 print(func2.__name__) #打印函数的名字

浙公网安备 33010602011771号