day012 装饰器进阶
一、多个装饰器装饰一个函数
1 def wrapper1(func): 2 def inner1(): 3 print('wrapper1 ,before func') 4 ret = func() 5 print('wrapper1 ,after func') 6 return ret 7 return inner1 8 9 10 def wrapper2(func): 11 def inner2(): 12 print('wrapper2 ,before func') 13 ret = func() 14 print('wrapper2 ,after func') 15 return ret 16 return inner2 17 18 19 def wrapper3(func): 20 def inner3(): 21 print('wrapper3 ,before func') 22 ret = func() 23 print('wrapper3 ,after func') 24 return ret 25 return inner3 26 27 28 @wrapper3 29 @wrapper2 30 @wrapper1 31 def f(): 32 print('in f') 33 return '哈哈哈' 34 35 36 print(f())
输出结果为:
1 wrapper3 ,before func 2 wrapper2 ,before func 3 wrapper1 ,before func 4 in f 5 wrapper1 ,after func 6 wrapper2 ,after func 7 wrapper3 ,after func 8 哈哈哈
二、函数及装饰器总结
1 # 函数 —— 2天 2 # 函数的定义和调用 3 # def 函数名(形参): 4 #函数体 5 #return 返回值 6 #调用 函数名(实参) 7 # 站在形参的角度上 : 位置参数,*args,默认参数(陷阱),**kwargs 8 # 站在实参的角度上 : 按照位置传,按照关键字传 9 # 返回值:没有返回值 返回一个值 返回多个值 10 # 接收返回值:没有返回值不接收,返回一个值用一个变量接收,返回多个值用一个变量或者对应数目的变量接收 11 # 闭包函数 —— 在内部函数引用外部函数的变量 12 # 装饰器函数—— 装饰器一定是闭包函数 13 # 装饰器的作用 : 在不改变原来函数的调用方式的情况下 在这个函数的前后添加新的功能 14 # 完美的符合了一个开发原则 :开放封闭原则 15 # 对扩展是开发的 16 # 对修改是封闭的 17 # 基础的装饰器 18 # from functools import wraps 19 # def wrapper(func): 20 # @wraps(func) 21 # def inner(*args,**kwargs): 22 # '''在函数被调用之前添加的代码''' 23 # ret = func(*args,**kwargs) # func是被装饰的函数 在这里被调用 24 # '''在函数被调用之后添加的代码''' 25 # return ret 26 # return inner 27 # 使用 —— @wrapper 28 # @wrapper 29 # def func(): #inner 30 # pass 31 # 32 # func.__name__ 33 34 # 带参数的装饰器 35 # @wrapper -- > @warapper(argument) 36 # 三层嵌套函数 37 # def outer(形参): 38 # def wrapper(func): 39 # def inner(*args,**kwargs): 40 # '''在函数被调用之前添加的代码''' 41 # ret = func(*args,**kwargs) # func是被装饰的函数 在这里被调用 42 # '''在函数被调用之后添加的代码''' 43 # return ret 44 # return inner 45 # return wrapper 46 # @outer(True) 47 # def func(): 48 # pass 49 50 51 52 # 多个装饰器装饰一个函数 53 # 俄罗斯套娃 54 55 #def wrapper1(func): 56 # @wraps(func) 57 # def inner(*args,**kwargs): 58 # print('before 1') 59 # print('******') 60 # ret = func(*args,**kwargs) # func是被装饰的函数 在这里被调用 61 # '''在函数被调用之后添加的代码''' 62 # return ret 63 # def wrapper2(func): 64 # @wraps(func) 65 # def inner(*args,**kwargs): 66 # print('before 2') 67 # ret = func(*args,**kwargs) # func是被装饰的函数 在这里被调用 68 # '''在函数被调用之后添加的代码''' 69 # return ret 70 # @wrapper1 71 # @wrapper2 72 # def func(): 73 # print('111')

浙公网安备 33010602011771号