装饰器进阶

装饰器进阶
查看函数内包含的函数名和日志
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()

原文地址:https://www.cnblogs.com/2018-01-30/p/8417899.html