文章目录
装饰器
装饰器其实也是一种闭包, 其功能就是在不破坏目标函数原有的代码和功能的前提下, 为目标函数增加性功能.
现在有一个 sleep 函数
python
def sleep():
import random
import time
print("sleeping")
time.sleep(random.randint(1, 5))
现在希望给 sleep 函数增加一个新功能:
- 在调用 sleep 前输出:
I will sleep - 在调用 sleep 后输出:
I wake
有下面的代码:
python
print("I will sleep")
sleep()
print("I wake")
但是这样的方式非常的不优雅,那有没有其他方式呢, 有的, 可以使用 装饰器来实现
装饰器的一般写法 (闭包写法)
python
def sleep():
import random
import time
print("sleeping")
time.sleep(random.randint(1, 5))
def outer(func):
def inner():
print("I will sleep")
func()
print("I wake")
return inner
fn = outer(sleep)
fn()
装饰器的语法糖写法
python
def outer(func):
def inner():
print("I will sleep")
func()
print("I wake")
return inner
@outer
def sleep():
import random
import time
print("sleeping ...")
time.sleep(random.randint(1, 5))
sleep()
使用@outer, 定义在目标函数之上
这种写法与装饰器的一般写法的调用方式以一样的, 这里调用 sleep() , 本质上调用的还是 inner()