01.什么是装饰器
把一个函数当作参数,返回一个替代版的函数
本质就是一个返回函数的函数
“在不改变原函数的基础上,给函数增加功能”
函数对修改是封闭的,对扩展是开放的
也就是说,是给一个已经写好的函数进行修改时,并不改变这个已经写好的函数,而是再写一个函数来进行调用这个函数,但是在原本已经调用过这个函数的位置不能一一修改,所以需要装饰器,装饰器需要在已经写好的函数之前写好,并在已经写好的函数之前加上语法糖,也叫糖衣语法,顾名思义,在调用此函数时,会先读取他的糖衣语法,再读取原本的函数,既满足了对函数的修改不修改原函数,又满足了调用时只是调用原函数。
import time
def decorator(func): #装饰器,参数是一个函数
def wrapper(*args): #返回的一个替代版的函数
print(time.time()) #此函数的功能是打印一个时间
func(*args) #执行原函数
return wrapper
@decorator #语法糖
def f1(func_name):
print('This is a function ' + func_name)
@decorator
def f2(func_name1,func_name2):
print('This is a function ' + func_name1)
print('This is a function ' + func_name2)
f1('test')
f2('test1','test2')
示例:
import time
def decorator(func):
def wrapper(*args):
print(time.time())
func(*args)
return wrapper
@decorator
def f1(func_name):
print('This is a function ' + func_name)
@decorator
def f2(func_name1,func_name2):
print('This is a function ' + func_name1)
print('This is a function ' + func_name2)
f1('test')
f2('test1','test2')
运行结果:
也可以加多个参数
多个装饰器
当一个函数已经有装饰器时,可以再增加另一个装饰器
示例:
def decorator_a(fun):
print('Get in decorator_a')
def inner_a(*args, **kwargs):
print('Get in inner_a')
res = fun(*args, **kwargs)
return res
return inner_a
def decorator_b(fun):
print('Get in decorator_b')
def inner_b(*args, **kwargs):
print('Get in inner_b')
res = fun(*args, **kwargs)
return res
return inner_b
def decorator_c(fun):
print('Get in decorator_c')
def inner_c(*args, **kwargs):
print('Get in inner_c')
res = fun(*args, **kwargs)
return res
return inner_c
@decorator_a
@decorator_b
@decorator_c
def f(x):
print('Get in f')
return x * 2
f(2)
运行结果:
Get in decorator_c
Get in decorator_b
Get in decorator_a
Get in inner_a
Get in inner_b
Get in inner_c
Get in f
可以看出,当函数存在多个装饰器时,会自下向上执行装饰器的壳子,自上向下执行装饰器内部。