多个装饰器调用问题
import timedef logger(msg):
def time_master(func):
def call_func():
print(msg+'开始执行程序')
start= time.time()
func()
stop= time.time()
print('结束执行程序')
print(f'执行时间{(stop - start):.2f}')
return call_func
return time_master
@logger(msg = 'b')
@logger(msg = 'a')
def myfunc():
time.sleep(1)
print('正在执行1秒休息')
myfunc()
执行结果
b开始执行程序
a开始执行程序
正在执行1秒休息
结束执行程序
执行时间1.02
结束执行程序
执行时间1.06
为啥会是这个结果,不应该是先执行a再执行b么
希望各位前辈答疑解惑,感谢感谢! 本帖最后由 isdkz 于 2022-4-1 14:43 编辑
@logger(msg = 'b')
@logger(msg = 'a')
def myfunc():
time.sleep(1)
print('正在执行1秒休息')
相当于
myfunc = logger(msg = 'b')(logger(msg = 'a')(myfunc))
所以先是输出 b 再输出 a
@装饰器
def 函数:
是相当于函数 = 装饰器(函数) isdkz 发表于 2022-3-31 18:17
@logger(msg = 'b')
@logger(msg = 'a')
def myfunc():
前辈,您太厉害了,就是相当于myfunc = logger(msg = 'b')(logger(msg = 'a')(myFunc))
但是我不明白这个程序为啥是这样运行的呜呜呜呜呜
logger(msg = 'b')这是最外层返回值是time_master
相当于time_master(logger(msg = 'a')(myFunc))
是不是把logger(msg = 'a')(myFunc)当作func放入call_func()中调用
print(msg+'开始执行程序')=b开始执行程序
func()=a开始执行程序
正在执行1秒休息
结束执行程序
执行时间1.02
print('结束执行程序')=结束执行程序
print(f'执行时间{(stop - start):.2f}')=执行时间1.05
李二蛋 发表于 2022-4-1 10:06
前辈,您太厉害了,就是相当于myfunc = logger(msg = 'b')(logger(msg = 'a')(myFunc))
但是我不明白这 ...
对的,@ 是一个语法糖,它的本质就是将被它修饰的函数传进去,
然后将它的返回值替换原来的函数,你只要记住下面这个就不会那么云里雾里了
@装饰器
def 函数:
...
相当于
def 函数:
...
函数 = 装饰器(函数) isdkz 发表于 2022-4-1 10:12
对的,@ 是一个语法糖,它的本质就是将被它修饰的函数传进去,
然后将它的返回值替换原来的函数,你只 ...
好嘞,感谢前辈哈
页:
[1]