当前位置:
首页 > temp > python入门教程 >
-
Python装饰器(3)
这篇文章中记录说明下多个装饰器一同装饰同一个函数时的执行顺序问题。
【装饰器链】
按照惯例,先看代码示例:
import time def debug1(str): #传参接受类的方法 def func11(f1): def func12(my,m,n): #原类方法有三个参数,故内层函数需要传递相同的参数 print("\n\rStarting debug1()\n\r") f1(my,m,n) print("\n\rStopped debug1()\n\r") return func12 #返回内层函数 return func11 def debug2(num): #传参接受类的方法 def func21(f2): def func22(my,m,n): #原类方法有三个参数,故内层函数需要传递相同的参数 print("\n\rStarting debug2()\n\r") time.sleep(num) f2(my,m,n) print("\n\rStopped debug2()\n\r") return func22 #返回内层函数 return func21 class test(): @debug2(3) #sleep N秒后再执行 @debug1("Steve Jobs") #打印此次的执行人员 def myAdd(self,a,b): print(a + b) if __name__ == "__main__": myIns=test() myIns.myAdd(2,3)
其执行结果如下:
结果就像三明治夹心一样:最顶、最底都为debug2的输出,次顶、次底都为debug1的输出,最中间的夹心为myAdd的输出。
为什么是这个样子呢?结合前两篇的介绍我们容易得知,这种简写的方式其实质是下面这种调用关系:
import time def debug1(str): #传参接受类的方法 def func11(f1): def func12(my,m,n): #原类方法有三个参数,故内层函数需要传递相同的参数 print("\n\rStarting debug1()\n\r") f1(my,m,n) print("\n\rStopped debug1()\n\r") return func12 #返回内层函数 return func11 def debug2(num): #传参接受类的方法 def func21(f2): def func22(my,m,n): #原类方法有三个参数,故内层函数需要传递相同的参数 print("\n\rStarting debug2()\n\r") time.sleep(num) f2(my,m,n) print("\n\rStopped debug2()\n\r") return func22 #返回内层函数 return func21 class test(): #@debug2(3) #sleep N秒后再执行 #@debug1("Steve Jobs") #打印此次的执行人员 def myAdd(self,a,b): print(a + b) #上面两行的简写格式,其实质是下面这种调用关系: func21=debug2(3) #因为装饰器带有参数,实际上就是函数调用,需要先执行 func11=debug1("Steve Jobs") #因为装饰器带有参数,实际上就是函数调用,需要先执行 myAdd=func11(myAdd) #此处得到的myAdd实质就是func12 myAdd=func21(myAdd) #此处得到的myAdd实质就是func22 if __name__ == "__main__": myIns=test() myIns.myAdd(2,3) #此时调用的其实是func22(2,3)
其执行结果如下(跟上面的简写形式结果一致,进一步验证了我们的拆分是等价的):
通过上述实验证明:多个装饰器同时装饰一个函数的时候,调用的原则是:由近及远。
出 处:https://www.cnblogs.com/lucky815/p/14534262.html
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
SQL Server -- 解决存储过程传入参数作为s
关于JS定时器的整理
JS中使用Promise.all控制所有的异步请求都完
js中字符串的方法
import-local执行流程与node模块路径解析流程
检测数据类型的四种方法
js中数组的方法,32种方法
前端操作方法
数据类型
window.localStorage.setItem 和 localStorage.setIte
如何完美解决前端数字计算精度丢失与数