关于double装饰器的使用
class MyException(Exception): """自定义异常类""" pass def log(func): def f(): f.__name__ = "测试函数" print("开始调用{}".format(func.__name__)) try: func() except MyException: print("我成功捕获到了异常!!!") print("结束调用{}".format(func.__name__)) return f @log @log def v_for(): """自定义异常抛出函数""" for i in range(1,100): if i == 5: raise MyException print(i) if __name__ == '__main__': v_for()
用f.__name__ = “测试函数”定义了函数名称,但是最终输出的时候
第一个print没有取到“测试函数”,但结尾的print取到了。请问是什么原因,具体的参数传递是怎么样的?
5
收起
正在回答
1回答
同学,你好。
1、多层装饰器会先执行离着被装饰函数近的那个,在执行log(v_for)函数时,在该函数中定义了f()函数,但并没有调用语句,即没有执行,而是作为了返回值,因此f()函数中的语句作为参数传递到了外层的装饰器log()函数中
2、下一步是执行log()函数中的内容,返回值为f。外层没有装饰器,因此会执行f中的内容,输出"开始调用f",此时func()为之前返回的f函数,执行f函数中的内容,此时f的__name__进行了修改,输出"开始调用v_for",f函数中的func()为v_for函数,当i=5时,抛出异常,输出'我成功捕获到了异常!!!'和'结束调用v_for',执行return f,返回到f函数中输出结束调用测试函数。
3、建议同学使用两个不同名称的装饰器,可以更清楚的明白执行流程。
如果我的回答解决了您的疑惑,请采纳!祝学习愉快~~~~
1.Python零基础入门
- 参与学习 人
- 提交作业 2727 份
- 解答问题 8160 个
想要进入Python Web、爬虫、人工智能等高薪领域,你需要掌握本阶段的Python基础知识,课程安排带你高效学习轻松入门,学完你也能听得懂Python工程师的行业梗。
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星