更新时间:2022-09-30 来源:黑马程序员 浏览量:
编者之前在知乎上看到一个很形象的比喻来描述装饰器,它是这么说的:
“内裤可以用来遮羞,但是到了冬天没法为我们防风御寒,聪明的人发明了长裤,有了长裤后就不会冷了。装饰器就像是这里说的长裤,在不影响内裤作用的前提之下,给我们的身体提供了保暖的功效。”
读完上面的句子,不知道大家有没有体会到装饰器的好处?好了,我们言归正传,我们开始装饰器的学习吧。
装饰器本质是一个Python函数,它可以在不改动其他函数的前提下,对函数的功能进行扩充。通常情况下,装饰器用于下列场景:
(1)引入日志;
(2)函数执行时间统计;
(3)执行函数前预备处理;
(4)执行函数后清理功能;
(5)权限校验;
(6)缓存。
先看一个简单的例子。
def test_one(): print('test_one')
现在有一个需求,希望可以输出函数的执行日志,这时,有人会这么实现:
def test_one(): print('test_one') print('test_one is running') test_one()
但是,如果函数test_two()、函数test_three()都有类似的需求,那么现在这样的做法会出现大量重复代码。为了减少重复的代码,我们可以创建一个新的函数专门记录函数执行日志,谁需要记录执行日志,就把谁作为参数传递,示例代码如下:
def print_log(func): print('函数正在运行中') func() def test(): print('test') print_log(test)
按照上述代码将函数作为参数传递,虽然可以实现功能,但是却破坏了原有代码的逻辑结构。如果要求已经实现的函数,不能修改,只能扩展,即遵守“封闭开放”原则,那么是不允许在函数test内部进行修改的。