首先看一个例子

 ''' 多个装饰器装饰一个函数 '''

 # 定义第一个装饰器
def set_func1(func):
def wrapper1(*args,**kwargs):
print('装饰内容开始1')
func(*args, **kwargs)
print('装饰内容结束1')
return wrapper1 # 定义第二个装饰器
def set_func2(func):
def wrapper2(*args,**kwargs):
print('装饰内容开始2')
func(*args, **kwargs)
print('装饰内容结束2')
return wrapper2 # 定义第二个装饰器
def set_func3(func):
def wrapper3(*args,**kwargs):
print('装饰内容开始3')
func(*args, **kwargs)
print('装饰内容结束3')
return wrapper3 @set_func1
@set_func2
@set_func3
def show():
print('Show Run....') show() 结果如下:
装饰内容开始1
装饰内容开始2
装饰内容开始3
Show Run....
装饰内容结束3
装饰内容结束2
装饰内容结束1 进程已结束,退出代码 0

使用简易代码分析执行流程--->实质就是几层函数的嵌套

 def wrapper1():
print("wrapper1 start") # 第1步
wrapper2() # 第2步
print("wrapper1 end") # 第10步 def wrapper2():
print("wrapper2 start") # 第3步
wrapper3() # 第4步
print("wrapper2 end") # 第9步 def wrapper3()
print("wrapper3 start") # 第5步
main_function() # 第6步
print("wrapper3 end") # 第8步 def main_func()
print("hello Python") # 第7步 main_func() # start

如果你和我有共同爱好,我们可以加个好友一起交流!

最新文章

  1. Redis 3.0 与 3.2 配置文件变化
  2. js调用页面打印
  3. ERROR actor.OneForOneStrategy: org.apache.spark.SparkContext
  4. android wireshark抓包和fiddler抓包
  5. 每天一个linux命令(21):find命令之xargs
  6. Gym 100851G Generators (vector+鸽笼原理)
  7. 工作中常用的QTP操作Excel函数
  8. Matlab 矩阵运算
  9. Startup 和 Middleware(中间件)
  10. 十八、oracle 角色
  11. IOS 股票K线图、分时图
  12. Java历程-初学篇 Day09 冒泡排序
  13. [Sqoop]利用sqoop对mysql运行DML操作
  14. Spring Boot快速入门(二):http请求
  15. C#实现完整的防盗自制监控系统
  16. [FE] 有效开展一个前端项目2 (vuejs-templates/webpack)
  17. go捕获Ctrl+C信号
  18. 关于win10安装NET Framework 3.5,错误87的终极解答0x80070057
  19. python3面向对象注意事项
  20. restful framework之频率组件

热门文章

  1. mybatis源码专题(2)--------一起来看下使用mybatis框架的insert语句的源码执行流程吧
  2. Senparc.Weixin.MP SDK 微信公众平台开发教程(二十二):如何安装 Nuget(dll) 后使用项目源代码调试
  3. 记录工作中groovy动态生成Flink任务
  4. 洛谷 P3868 [TJOI2009]猜数字
  5. [c++] 面试题之犄角旮旯 第壹章
  6. JQuery发送ajax请求时中文乱码
  7. 远程桌面连接mstsc 超扎心
  8. 基于WeChat的消息存储备份、远程控制、小功能项目开源分享计划
  9. opencv目标检测之canny算法
  10. 阿里云ESC服务器centos6.9使用及注意事项