python多个装饰器修饰一个函数

文章资讯 2020-06-14 15:51:44

python多个装饰器修饰一个函数

装饰器:用@语法把函数传入装饰器,把原函数的元信息拷贝到装饰器中。
装饰器的内外函数之间的语句没有装饰目标函数,而是在装载装饰器时的附加操作。装饰是为函数和类指定管理或扩增代码的一种方式,装饰器本身采取课调用的对象形式(如函数)并处理其可调用对象。程序执行时,由上往下执行,在执行过程中首先要完成传参。
第一步:传参过程,从下往上
@outter61
@outter62
@outter63
func3====check原check----->inner63此时check指向inner63
func2====check(inner63)check---->inner62
func1====check(inner62)check---->inner61第二步:执行过程
check()--->inner61()----->inner62()---->inner63---->check原仅由程序执行过程来看,先执行outter61.进入outter61后,
首先打印("第一个装饰器~~~~111")
下一步执行func1,此时func1的执行需要调用inner62才能完成,
执行过程进入inner62后打印("第二个装饰器~~~~2222")
下一步执行func2,此时func2的执行需要调用inner63,
执行过程进入inner63,此时func3正是被传入(装饰)的原函数check(),
继而返回inner63,执行inner63内剩余步骤,即打印("第三个装饰器~~~~333")
执行过程进入原函数,打印check(输出到此结束,但是程序的执行还未停止),
执行到这一步,返回到inner62,func2对inner63的调用完成。
执行到这一步,返回到inner61,func1对inner62的调用完成。
整个函数结束。工作原理:check一直修改指向的过程个人的浅见(理论知识储备不足,有措辞或者其他问题,请谅解):
装饰器使用的过程中,其实就是将原函数和想要添加的新功能封装到同时一个函数内,所谓的传参(将原函
数作为参数传入装饰器),其实就是将原函数加载到装饰器内部中,封装成了新的函数,新函数和原函数的
共同作用完成用户需求。一个装饰器修饰多个函数,相对容易理解,多个装饰器同时装饰同一个函数,说
到底就是嵌套函数的调用(此处言论均属个人推测,不合理的请大家不吝赐教。),简
单的举个例子:你(某个新功能)向你爸(inner61)借钱(outter61的参数check()函数就是你要借的
钱),但是你爸(inner61)的钱由你妈(inner62)保管,你爸(inner61)接收到了你的借钱请求传达给
了你妈(inner62),但是你妈的钱在银行(inner63)存着,你妈得先去银行(inner63)把你要用的钱
(check()原函数)取出来,然后给你爸(inner61),你爸(inner61)再给你。
#多个装饰器作用于一个函数defoutter61(func1):
#outter61的参数是一个函数,返回值也是一个函数。其中作为函数的func1就在返回函数inner61内执行。
definner61(*args,**kwargs):#inner61内的参数其实是传入的inner62。
print("第一个装饰器~~~~111")
func1(*args,**kwargs)
returninner61
defoutter62(func2):#inner62内的参数其实是传入的inner63
definner62(*args,**kwargs):
print("第二个装饰器~~~~2222")
func2(*args,**kwargs)
returninner62
defoutter63(func3):#inner63内的参数其实是传入的check()
#也就是说只有执行过程进入inner63才会执行被装饰的函数check,故整个执行过程check仅打印一次。
definner63(*args,**kwargs):
func3(*args,**kwargs)
print("第三个装饰器~~~~333")
returninner63
@outter61
@outter62
@outter63
defcheck():
print("check")
check()"""
输出结果:
第一个装饰器~~~~111
第二个装饰器~~~~2222
check
第三个装饰器~~~~333
"""