python 中多个装饰器的执行顺序
python 中多个装饰器的执行顺序:
def wrapper1(f1):
print('in wrapper1')
def inner1(*args,**kwargs):
print('in inner1')
ret = f1(*args,**kwargs)
print('111')
return ret
return inner1
def wrapper2(f2):
print('in wrapper2')
def inner2(*args,**kwargs):
print('in inner2')
ret = f2(*args,**kwargs)
print('222')
return ret
return inner2
def wrapper3(f3):
print('in wrapper3')
def inner3(*args,**kwargs):
print('in inner3')
ret = f3(*args,**kwargs)
print('333')
return ret
return inner3
@wrapper1 #3 func = wrapper1(func)即 func = wrapper2(inner2) -->f1 = inner2 -->打印in wrapper1 --> func = inner1
@wrapper2 #2 func = wrapper2(func)即 func = wrapper2(inner3) -->f2 = inner3 --> 打印in wrapper2 --> func = inner2
@wrapper3 #1 func = wrapper3(func) --> f3 = func -->打印in wrapper3 --> func = inner3
def func(): # 先执行离被装饰函数最近的那个装饰器
print('in func')
func() #4 func = inner1
#5 执行func() 即 执行inner1()-->打印in inner1 --> 执行f1()即执行inner2()-->打印in inner2-->执行f2()即执行inner3()-->打印in inner3-->
#6 -->执行f3()即执行func()-->打印in func-->打印333-->inner3执行完毕,返回到inner2-->打印222-->inner2执行完毕,返回到inner1-->
#7 -->打印111-->inner1执行完毕-->程序执行完毕
# 结果:
# in wrapper3
# in wrapper2
# in wrapper1
# in inner1
# in inner2
# in inner3
# in func
# 333
# 222
# 111
# 装饰器函数在被装饰函数定义好后立即执行。多个装饰器的调用顺序是自下往上的(装饰器装饰函数时的上下顺序)。
# 被装饰函数执行时,装饰器的执行顺序是从上往下的(装饰器装饰函数时的上下顺序,和装饰器函数定义顺序无关)。
python 中多个装饰器的执行顺序的更多相关文章
- 第7.26节 Python中的@property装饰器定义属性访问方法getter、setter、deleter 详解
第7.26节 Python中的@property装饰器定义属性访问方法getter.setter.deleter 详解 一. 引言 Python中的装饰器在前面接触过,老猿还没有深入展开介绍装饰 ...
- Python中利用函数装饰器实现备忘功能
Python中利用函数装饰器实现备忘功能 这篇文章主要介绍了Python中利用函数装饰器实现备忘功能,同时还降到了利用装饰器来检查函数的递归.确保参数传递的正确,需要的朋友可以参考下 " ...
- python中面向对象之装饰器
python面向对象内置装饰器property,staticmethod,classmethod的使用 @property 装饰器作用及使用 作用:面向对象中的方法伪装成属性 使用如下: class ...
- Python中的各种装饰器详解
Python装饰器,分两部分,一是装饰器本身的定义,一是被装饰器对象的定义. 一.函数式装饰器:装饰器本身是一个函数. 1.装饰函数:被装饰对象是一个函数 [1]装饰器无参数: a.被装饰对象无参数: ...
- 谈谈Python中的decorator装饰器,如何更优雅的重用代码
众所周知,Python本身有很多优雅的语法,让你能用一行代码写出其他语言很多行代码才能做的事情,比如: 最常用的迭代(eg: for i in range(1,10)), 列表生成式(eg: [ x* ...
- Python中的单例模式——装饰器实现剖析
Python中单例模式的实现方法有多种,但在这些方法中属装饰器版本用的广,因为装饰器是基于面向切面编程思想来实现的,具有很高的解耦性和灵活性. 单例模式定义:具有该模式的类只能生成一个实例对象. 先将 ...
- python中闭包和装饰器的理解(关于python中闭包和装饰器解释最好的文章)
转载:http://python.jobbole.com/81683/ 呵呵!作为一名教python的老师,我发现学生们基本上一开始很难搞定python的装饰器,也许因为装饰器确实很难懂.搞定装饰器需 ...
- Python中的@函数装饰器到底是什么?
在解释@函数装饰器之前,先说一下,类中的类方法和静态方法. 在Python中完全支持定义类方法.静态方法.这两种方法很相似,Python它们都使用类来调用(ps:用对象调用也可以). 区别在于:Pyt ...
- Python中闭包、装饰器的概念
1.闭包(Closure)的概念: 内部函数中对enclosing作用域的变量进行引用 1 passline = 60 2 def func(val): 3 print('%x' % id(val)) ...
随机推荐
- python中的while循环,格式化输出,运算符,编码
一.while循环 1.1语法 while 条件: 代码块(循环体) else: 当上面的条件为假的的时候,才会执行. 执行顺序:先判断条件是否为真,如果是真的,执行循环体,再次判断条件,直到条件不成 ...
- 创建服务消费者(Ribbon)
概述 在微服务架构中,业务都会被拆分成一个独立的服务,服务与服务的通讯是基于 http restful 的.Spring cloud 有两种服务调用方式,一种是 ribbon + restTempla ...
- Hibernate注解(一):基本注解
在Hibernate中使用注解,主要是为了替代映射文件,完成“类到表,属性到字段”的映射.JPA提供了一套功能强大的注解.Hibernate直接使用了JPA的这套注解.当然,对于JPA中的一些不足,H ...
- 零基础配置Hadoop集群——Ambari安装及配置详解
1. 准备工作 1.1. 系统环境 主机列表: IP地址 HostName 描述 192.168.610.153 ambari.server Ambari服务器 192.168.10.152 had ...
- Java多线程同步工具类之CountDownLatch
在过去我们实现多线程同步的代码中,往往使用join().wait().notiyAll()等线程间通信的方式,随着JUC包的不断的完善,java为我们提供了丰富同步工具类,官方也鼓励我们使用工具类来实 ...
- web页面的时间传入servlet如何转换为可以存入MySQL的Date类型
在web页面中当使用如下语句: <input type="date" name="startTime"/> 提交到servlet中 在servlet ...
- spring 5.x 系列第2篇 —— springmvc基础 (代码配置方式)
文章目录 一.搭建hello spring工程 1.1 项目搭建 1.2 相关注解说明 二.配置自定义拦截器 三.全局异常处理 四.参数绑定 4.1 参数绑定 4.2 关于日期格式转换的三种方法 五. ...
- JS工具整理
1.获取今日日期:摘抄地址:https://www.cnblogs.com/carekee/articles/1678041.html getTodayFmt('yyyy-MM-dd') getTod ...
- win的cmd环境中设置***代理
想在win的cmd环境中设置代理进行FQ安装软件,如npm等一系列. 1.配置好shadowsocks,然后编辑服务器,查看代理端口 2.打开win命令行cmd set http_proxy=http ...
- 与 MySQL 因“CST” 时区协商误解导致时间差了13 小时
CST 时区名为 CST 的时区是一个很混乱的时区,有四种含义: 美国中部时间 Central Standard Time (USA) UTC-05:00 / UTC-06:00 澳大利亚中部时间 C ...