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)

  

 

posted @ 2022-03-26 13:35  今天也是开心的一天呀  阅读(32)  评论(0)    收藏  举报