首先是不使用装饰器的情况,又需要在不修改原函数的情况话修改函数结果
1 def outer(func): 2 def inner(): 3 print("Hello") 4 ret = func() 5 print("World") 6 return ret 7 return inner 8 9 def Fun(): 10 print("Fun") 11 12 outer(Fun)() 13 14 结果: 15 Hello 16 Fun 17 World
在不使用装饰器的情况下,虽然结果一样,但是调用者需要修改调用方式,如果该函数是提供给很多人使用的,则很不方便
接下来是使用装饰器的方法
1 def outer(func): 2 def inner(): 3 print("Hello") 4 ret = func() 5 print("World") 6 return ret 7 return inner 8 9 @outer 10 def Fun(): 11 print("Fun") 12 13 Fun()
结果相同,但是函数调用者不需要修改调用方式
函数带有参数的情况
1 def outer(func): 2 def inner(x, y): 3 print("Hello") 4 ret = func(x, y) 5 print("World") 6 return ret 7 return inner 8 9 @outer 10 def Fun(x, y): 11 print(x + y) 12 13 Fun(1, 2) 14 15 结果: 16 Hello 17 3 18 World
但是如果该装饰器需要装饰多个函数,并且函数中的参数个数不同,则可以采用下列方法解决
1 def outer(func): 2 def inner(*args, **kwargs): 3 print("Hello") 4 ret = func(*args, **kwargs) 5 print("World") 6 return ret 7 return inner 8 9 @outer 10 def Fun1(x, y): 11 print(x + y) 12 13 @outer 14 def Fun2(x, y, z): 15 print(x + y + z) 16 17 Fun1(1, 2) 18 Fun2(2, 3, 4)
在这种情况下,多个不同函数也可以使用同一个装饰器,并且python内部自动分配参数。
多个装饰器同时装饰一个函数
之前我们的装饰器是在函数调用前后分别输出 <q>Hello World</q> ,现在我们添加一个新的需求,在输出Hello之前输出Python用过重新写另外一个装饰器也可以实现,但是比较麻烦,不符合编码的代码重用规则,在这里我们使用另外一个装饰器,只需要将新增的功能添加到装饰器即可。
1 def outer(func): 2 def inner(*args, **kwargs): 3 print("Hello") 4 ret = func(*args, **kwargs) 5 print("World") 6 return ret 7 return inner 8 9 def outer2(func): 10 def inner(*args, **kwargs): 11 print("python") 12 ret = func(*args, **kwargs) 13 return ret 14 return inner 15 16 #使用两个装饰器 17 @outer2 18 @outer 19 def Fun(x, y): 20 print(x + y) 21 22 Fun(1, 2)