装饰器其实也是一种闭包,其功能就是在不破坏目标函数原有的代码和功能的前提下,为目标函数增加新功能
比如我们定义这样一个函数
def sleep():
import random
import time
print("睡眠中......")
time.sleep(random.randint(1,5))
希望给sleep函数增加一个功能
- 在调用sleep前输出:我要睡觉了
- 在调用sleep后输出:我起床了
简单来说,我们可以这样写
print("我要睡觉了")
sleep()
print("我起床了")
但这样写太不优雅了,我们可以使用装饰器
def outer(func):
def inner():
print("我要睡觉了")
func()
print("我起床了")
return inner
fn = outer(sleep)
fn()
快捷写法(语法糖)
使用@outer定义在目标函数sleep之上
def outer(func):
def inner():
print("我要睡觉了")
func()
print("我起床了")
return inner
@outer
def sleep():
import random
import time
print("睡眠中......")
time.sleep(random.randint(1,5))
sleep()