装饰器是在不改变原先函数的情况下,对当前函数进行装饰,增加额外的功能
下面以打印为函数加上打印log的修饰为例,分为以下几种
无参数,无返回值,定义装饰器函数,在调用函数的时候,为函数开始和结束添加log, 装饰器的作用如code展示,是将被装饰的函数,作为参数传入,然后,重新赋值为装饰器里面的函数
def outter(func):
def wrapper(*args, **kwargs):
print(func.__name__ + " +:")
func(*args, **kwargs)
print(func.__name__ + " -:")
return wrapper
@outter #log_print1 = outter(log_print1)
def log_print1():
print("log_print1 fun_c...")
@outter #log_print2 = outter(log_print2)
def log_print2():
print("log_print2 fun_c...")
log_print1()
log_print2()
#output
log_print1 +:
log_print1 fun_c...
log_print1 -:
log_print2 +:
log_print2 fun_c...
log_print2 -:
无参数,有返回值
def outter(func):
def wrapper(*args, **kwargs):
print(func.__name__ + " +:")
ret = func(*args, **kwargs)
print(func.__name__ + " -:")
return ret
return wrapper
@outter
def add(x, y):
print("add fun_c...")
return x + y
print(add(3, 4))
# output
add +:
add fun_c...
add -:
7
使用参数,有返回值
def outter(flag):
def intter(func):
def wrapper(*args, **kwargs):
print(func.__name__ + ' ' + flag + " +:")
ret = func(*args, **kwargs)
print(func.__name__ + ' ' + flag + " -:")
return ret
return wrapper
return intter
@outter('my_add') # add = outter('my_add')(add) = intter(add)
def add(x, y):
print("add fun_c...")
return x + y
@outter('my_sub')
def sub(x, y):
print("sub fun_c...")
return x - y
print(add(3, 4))
print(sub(3, 4))
# output
add my_add +:
add fun_c...
add my_add -:
7
sub my_sub +:
sub fun_c...
sub my_sub -:
-1