@log和@log_in执行顺序是什么样的?

@log和@log_in执行顺序是什么样的?



def log(func):
   """ 记录函数执行的日志 """

   def wrapper():
       print("start")
       func()
       print('end')
   return wrapper


def log_in(func):
   """ 记录函数执行的日志 """

   def wrapper():
       print("开始进入")
       func()
       print('结束')
   return wrapper


@log
def hello():
   """ 简单功能模拟 """
   print('hello world')


@log
@log_in
def test():
   print('test ..')


if __name__ == '__main__':
   # hello()
   test()

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
好帮手慕美 2020-08-02 17:00:34

同学,你好,在调用test()函数时,会先执行离着近的装饰器@log_in,再执行@log。

在log_in函数内定义了wrapper函数,但并没有类似于wrapper()的语句,因此该函数内的语句并没有立即执行,而是作为了返回值。因此wrapper内的3条语句作为输入参数传递到了log内。

下一步是执行log函数内容。返回值为wrapper。由于更外层没有装饰器,因此接下来就将执行wrapper内的内容。打印start。接着执行func()函数,注意此处func()表示的是log_in的wrapper中的内容,因此跳到log_in的wrapper中执行。打印值为“开始进入”。

类似的,log_in的wrapper中的func()为test(),因此接着会输出“test ..”,继续执行输出“结束”,最后,回到log的最后一行,输出“end”。到这里,整个装饰器的运行过程结束。

这里都是文字,不太好理解,同学可以在debug格式下进行一步步的调用更方便同学理解。

如果我的回答解决了您的疑惑,请采纳!祝学习愉快~~~

  • 提问者 技术佬 #1
    并没有类似于wrapper()的语句怎么理解??? def log_in(func): """ 记录函数执行的日志 """ def wrapper(): print("开始进入") func() print('结束') return wrapper
    2020-08-02 18:05:45
  • 好帮手慕美 回复 提问者 技术佬 #2
    同学,你好。wrapper()表示调用该函数,并没有调用语句。祝学习愉快~~~~
    2020-08-02 19:02:25
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
1.Python零基础入门
  • 参与学习           人
  • 提交作业       2727    份
  • 解答问题       8160    个

想要进入Python Web、爬虫、人工智能等高薪领域,你需要掌握本阶段的Python基础知识,课程安排带你高效学习轻松入门,学完你也能听得懂Python工程师的行业梗。

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师