Python多个装饰器的调用顺序实例解析

作者:一切都是当下 时间:2021-09-30 06:54:56 

一般情况下,在函数中可以使用一个装饰器,但是有时也会有两个或两个以上的装饰器。多个装饰器装饰的顺序是从里到外(就近原则),而调用的顺序是从外到里(就远原则)

样例:


def func1(func):
 print(1)
 def inner1(*args, **kwargs):
   print(2)
   res = func(*args, **kwargs)
   print(3)
   return res
 print(4)
 return inner

def func2(func):
 print(5)
 def inner2(*args, **kwargs):
   print(6)
   res = func(*args, **kwargs)
   print(7)
   return res
 print(8)
 return inner<br data-filtered="filtered">
@func1
@func2
def go():
 print("running..")<br data-filtered="filtered">go()

其实函数go的执行本质是如下:

  • a=func2(go);a的内容为inner2函数的函数地址;因此输出的内容为5,8两个值

  • b=func1(a);b的内容为inner1函数的函数地址,因此输出的内容为1,4两个值

  • b();执行inner1()函数,里面的func的值为inner2,而inner2里面的func的值为go,因此输出的内容,因此为2,6,running,7,3

即b(func1(func2(go)))()

等同如下效果:

a=func2(go);a的内容为inner2函数的函数地址;因此输出的内容为5,8两个值

go=func1(a);此处的go是一个新变量,而非go函数的标识,go的内容为inner1函数的函数地址,因此输出的内容为1,4两个值

go();执行inner1()函数,里面的func的值为inner2,而inner2里面的func的值为真正定义的go函数地址,因此输出的内容,因此为2,6,running,7,3

即go(func1(func2(go)))()

实测结果:


C:\Python27\python.exe D:/code-program/lianxi-test/route.py
5
8
1
4
2
6
running..
7
3

Process finished with exit code 0

来源:https://www.cnblogs.com/potato-chip/p/12918135.html

标签:Python,装饰器,顺序
0
投稿

猜你喜欢

  • python套接字流重定向实例汇总

    2022-04-15 07:53:41
  • 用一条SQL实现:一行多个字段数据的最大值

    2008-12-31 13:37:00
  • JS数组方法汇总

    2009-08-03 14:06:00
  • Cookies 欺骗漏洞的防范方法(vbs+js 实现)

    2011-03-09 11:09:00
  • 提高asp程序访问速度的方法

    2008-10-23 16:37:00
  • python+tkinter编写电脑桌面放大镜程序实例代码

    2023-08-02 17:10:43
  • python实现电脑自动关机

    2021-05-03 13:41:43
  • ASP+FSO生成的网页文件默认编码格式以及转换成UTF-8编码方法

    2011-03-07 11:10:00
  • tkinter如何实现label超链接调用浏览器打开网址

    2023-04-05 15:08:20
  • 设计表单的标签和输入区

    2009-04-27 16:16:00
  • Python实现绘制圣诞树和烟花的示例代码

    2022-03-22 16:22:20
  • MySQL数据库配置技巧

    2009-03-06 14:32:00
  • Pyinstaller+Pipenv打包Python文件的实现示例

    2021-06-11 01:49:51
  • Python列表list内建函数用法实例分析【insert、remove、index、pop等】

    2022-01-13 10:18:24
  • Python词法结构

    2022-01-10 00:33:21
  • Js通过AES加密后PHP用Openssl解密的方法

    2023-07-17 08:04:42
  • 内容呈现的减法

    2007-11-16 16:22:00
  • JavaScript学习心得之如何走出初学困境

    2008-12-24 13:30:00
  • 关于ASP代码的加密

    2007-10-15 12:30:00
  • python的语句结构你真的了解吗

    2022-08-11 23:05:39
  • asp之家 网络编程 m.aspxhome.com