装饰器(Decorator)是面向对象设计模式的一种,这种模式的核心思想是在不改变原来核心业务逻辑代码的情况下,对函数或类对象进行额外的修饰。python中的装饰器由python解释器直接支持,其定义形式如下:
@decorator
def core_service:
....
要理解上述代码的含义,我们从自定义函数装饰器的原理出发。以下是示例代码:
importos, sys
defdecor_wrapper(func):
defdecorator():
print('Get in decorator')
func()
returndecorator
defcore_service():
print('Get in core_service')
if__name__ == '__main__':
core_service = decor_wrapper(core_service)
core_service()
运行结果:
Get in decorator
Get in core_service
原理:以上代码是一个简单的函数装饰器示例。核心代码逻辑是core_service()函数,真正的装饰器函数是定义在decor_wrapper()函数内部的decorator()函数,这个函数实现了装饰功能并调用了核心业务功能。decor_wrapper()函数仅仅是一个包装函数,用来返回装饰器的引用。core_service最终引用的是decor_wrapper()函数返回的装饰器函数,最后调用core_service()函数其实执行的就是装饰器函数decorator()。
以上编写装饰器代码的步骤比较多,且模式是固定的,因此python提供了语言级别的封装。上述代码可以抽象成如下形式,结果同上:
importos, sys
defdecor_wrapper(func):
defdecorator():
print('Get in decorator')
func()
returndecorator
@decor_wrapperdefcore_service():
print('Get in core_service')
if__name__ == '__main__':
core_service()
@decor_wrapper
defcore_service():
print('Get in core_service')
python解释器会将这段代码解析成以下形式:
defcore_service():
print('Get in core_service')
core_service = decor_wrapper(core_service)
通过以上分析,我们已经清楚了装饰器原理。真实的装饰器还会带有各种参数,实现各种复杂的功能,这些都是建立在这个基本原理的基础之上。下面我们再通过一个类装饰器的示例代码来结束这个主题:
importos, sys
defdecor_wrapper(cls):
defdecorator():
print('Get in decorator')
returncls()
returndecorator
@decor_wrapperclassCore:
def__init__(self):
print('New Core object')
if__name__ == '__main__':
core = Core()
运行结果:
Get in decorator
New Core object