一、装饰器是什么
python的装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。简单的说装饰器就是一个用来返回函数的函数。
它经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景。装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量与函数功能本身无关的雷同代码并继续重用。
概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能。
二、为什么需要装饰器
1、先来看一个简单例子
1 def foo():
2 print('i am foo'
2、增加需求
现在有一个新的需求,希望可以记录下函数的执行日志,于是在代码中添加日志代码:
1 def foo():
2 print('i am foo')
3 print("foo is running")
3、又有需求
假设现在有100个函数需要增加这个需求,并且后续可能还要对这一百个函数都增加执行前打印日志的需求,怎么办?还一个个改吗?
当然不了,这样会造成大量雷同的代码,为了减少重复写代码,我们可以这样做,重新定义一个函数:专门处理日志 ,日志处理完之后再执行真正的业务代码。
1 def use_logging(func):
2 print("%s is running" % func.__name__)
3 func()
4 def bar():
5 print('i am bar')
6 use_logging(bar)
7 #result:
8 #bar is running
9 #i am bar
通过以上use_logging函数我们增加了日志功能,不管以后有多少函数需要增加日志或者修改日志的格式我们只需要修改use_logging函数,并执行use_logging(被装饰的函数)就达到了我们想要的效果。
1 def use_logging(func):
2 print("%s is running" % func.__name__)
3 return func
4 @use_logging
5 def bar():
6 print('i am bar')
7 bar()