13、装饰器
其本质:在不需要做任何代码变动的前提下,增加额外的功能。装饰器返回的是一个函数对象。
相当于把函数作为参数传递进去,然后对函数进行装饰
其本质就是一个闭包
作用:
- 给原来的函数增加额外的功能
- 把原来的函数作为参数传递进去
13.1 基本用法
标准版的装饰器
1def wrapper(func): #func为原来的函数名 2 def inner(*agrs,**kwargs): 3 # 执行被装饰函数之前的操作 4 ret = func(*agrs,**kwargs) 5 # 执行被装饰函数之后的操作 6 return ret 7 return inner 8
1def test(): 2 print("发表评论:很喜欢~") 3 4#test() 5 6 7def wrapper(func): #外函数 , func为原来的函数名 8 def inner(): #内函数 9 print("是否登录:已经登录") 10 ret = func() #调用func函数 11 print("是否退出") 12 return ret 13 return inner 14 15new_test = wrapper(test) 16new_test()
13.2 语法糖用法 @装饰器名称
用法
@装饰器名称
1 2def wrapper(func): 3 def inner(): 4 print("是否已经登录") 5 func() 6 return inner 7 8 9@wrapper #wrapper为装饰器的名称,就是一个函数 10#被装饰的函数 11def test2(): 12 print("转发微博") 13 14 15@warpper 16def test3(): 17 print("发微博") 18 19test() 20# 结果 21# 是否已经登录 22# 转发微博 23test3() 24# 结果 25# 是否已经登陆 26# 发微博
1def wrapper(func,fn): 2 def inner(): 3 print("最开始") 4 func() 5 fn() 6 return inner 7 8def test2(): 9 print("转发微博") 10def test3(): 11 print("发微博") 12 13new_test = wrapper(test1,test2) 14new_test()
13.3 带参数的装饰器
使用语法糖的方式
1 2def outer(fn): 3 def inner(a,b): 4 print(f'{a},{b}') 5 fn(a,b) 6 return inner 7 8@outer 9def test(a,b): #要有两个参数 10 print("hello") 11 12 13test(1,2)
不使用语法糖的方式
1 2def outer(fn): 3 def inner(a,b): 4 print(f'{a},{b}') 5 fn() 6 return inner 7 8def test(): 9 print("hello") 10 11test = outer(test) 12test(1,2)
13.4 带不定长参数的装饰器
1 2def test(*args, **kwargs): 3 print(args) 4 print(kwargs) 5 6def wrapper(func): 7 def inner(*args, **kwargs): 8 print("开始") 9 func(*args, **kwargs) 10 print("结束") 11 return inner 12 13test = wrapper(test) 14test() 15 16
13.5 多个装饰器
1 2# 第一个装饰器 3def maketest1(fn): 4 def inner(): 5 return "你好啊" + fn() + '结束' 6 return inner 7 8# 第二个装饰器 9def maketest2(fn): 10 def inner(): 11 return "第二个" + fn() + "第二个结束" 12 return inner 13 14# 被装饰的第一个函数 15@maketest1 16def test1(): 17 return "留下来补课" 18 19print(test1()) 20 21 22# 被装饰的第二个 23@maketest2 24def test2(): 25 return "我要改名了" 26print(test2()) 27 28# 被装饰的第三个 29@maketest1 #再用maketest1进行装饰 30@maketest2 #先用maketest2进行装饰 31def test3(): 32 return "江湖没有传说" 33print(test3()) 34
