python装饰器
1.第一次需求场景
现在有100个函数,需要在每个函数执行前打印----before----,执行后打印-----after------.请完成这个需求
方法1:挨个给每个函数加上这两个print语句,优点是简单好实现 缺点是繁琐,100个需求就得修改100个函数,万一之后需求变动又得修改100个函数
方法2:使用一个函数来实现,把100个函数得函数名作为outer函数得参数,这样就实现了
优点:处理100个函数,只需要写一个函数就能解决。高效
如果之后需要修改,只需要改动outer函数,便捷
缺点:现在调用函数用的是outer(原来的函数名),比如outer(func1),如果其他地方需要使用func1()执行,那其他地方也得改

2.第二次需求场景
第一次需求场景中,outer函数得缺点是:
现在调用函数用的是outer(原来的函数名),比如outer(func1),如果其他地方需要使用func1()执行,那其他地方也得改
所以,第二次需求场景为:
在第一次需求的基础上,要求还是以func1(),func2()这种方式执行函数,实现新的加上before after的效果。而不是用outer(func1)来执行func1=outer(func1)
func1是函数名 所以outer(func1)返回的值也必须是函数名,也就是说return 函数名
且这个函数名对应的函数体实现效果是 before+origin()+after

所以把这三句话写到一个叫inner的函数里,变成这样,再加一个@outer,后面写func1 func2的函数体就可以了
优点:现在调用函数的方式也是func1()了,解决了上面提到的缺点
缺点:如果func1和func2这些函数的参数个数不同会报错

3.第三个场景
在满足前两个场景的基础上,可以执行不同数目的参数,并且不会报错

def outer(origin):
def inner(*args,**kwargs):
print("----before---")
res=origin(*args,**kwargs)
print("----after-----")
return res
return inner
@outer
def func1(a,b):
print("---执行func1函数----")
return "func1函数"
def func2():
print("---执行func2函数----")
return "func2函数"
func1(1,2)
浙公网安备 33010602011771号