装饰器进阶
查看函数内包含的函数名和日志
func.__name__
func.__doc__
子主题 3
解决办法:
from functools import wraps
在外层函数内顶层@wraps(f)
开方封闭原则
对修改是封闭的
对扩展是开方的
带参数的装饰器
由来:许多个函数,经常在需要被装饰与不装饰直间切换
格式:
flag = True
def outer(flag):
def wrapper(f):
def inner(*args, **kwargs):
if flag:
print('函数执行前的操作')
ret = f(*args, **kwargs)
if flag:
print('函数执行后的操作')
return ret
return inner
return wrapper
@outer(flag)
def func(*args, **kwargs):
pass
func()
只需要修改flag就可以是否开启装饰器
多个装饰器装饰一个函数
执行步骤
def wrapper1(f):
def inner1(*args, **kwargs):
print('decorator 1 before')
ret = f(*args, **kwargs)
print('decorator 1 after')
return ret
return inner1
def wrapper2(f):
def inner2(*args, **kwargs):
print('decorator 2 before')
ret = f(*args, **kwargs)
print('decorator 2 after')
return ret
return inner2
@wrapper2
@wrapper1
def func():
print('-'*10)
func()