装饰器decorate,顾名思义,用来装饰函数的。
例如,写一个函数f1,现在需要有新的功能在f1的基础上添加,可以像下面这样实现,而我以前也是这样实现的
def f1():
print("aaaa")
def f2():
f1()
print("5555")
这样实现,没什么问题的,可能就是代码可读性不是很好,使用装饰器如下:
def decorate(func):
def wrapper():
func()
print("5555")
return wrapper
@decorate
def f1():
print("aaaa")
1、f1被装饰函数
2、将被装饰函数作为参数传给装饰器decorate
3、执行decorate函数
带参数的情况
def decorate(func):
def wrapper(age):
func(age)
print("5555")
return wrapper
@decorate
def f1(age):
print("我今年{}岁".format(age))
f1(23)
运行结果
我今年23岁
5555
装饰器带参数,需要再嵌套一层,感觉在套娃
def test(a):
def decorate(func):
def wrapper(age):
func(age)
print("a={}".format(a))
return wrapper
return decorate
@test(a=10)
def f1(age):
print("我今年{}岁".format(age))
f1(23)
结果是
我今年23岁
a=10
多个装饰器
def decorate(func):
def wrapper(age):
func(age)
print("5555")
return wrapper
def decorate_2(func):
def wrapper(age):
func(age)
print("6666")
return wrapper
@decorate_2
@decorate
def f1(age):
print("我今年{}岁".format(age))
f1(23)
结果是
我今年23岁
5555
6666
离得近的装饰器先装饰,所以先输出5555