python 多个装饰器的调用顺序分析
一般情况下,在函数中可以使用一个装饰器,但是有时也会有两个或两个以上的装饰器。多个装饰器装饰的顺序是从里到外(就近原则),而调用的顺序是从外到里(就远原则)
样例:
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
@func1
@func2
def go():
print("running..")
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
python 多个装饰器的调用顺序分析的更多相关文章
- python 多个装饰器的调用顺序
python 多个装饰器的调用顺序 一般情况下,在函数中可以使用一个装饰器,但是有时也会有两个或两个以上的装饰器.多个装饰器装饰的顺序是从里到外(就近原则),而调用的顺序是从外到里(就远原则). 原代 ...
- python两个装饰器的运算顺序
#装饰顺序按靠近函数顺序执行,调用时由外而内,执行顺序和装饰顺序相反. def makebold(func): def wrap(): return "<i>"+fun ...
- python多个装饰器的执行顺序
def decorator_a(func): print 'Get in decorator_a' def inner_a(*args, **kwargs): print 'Get in inner_ ...
- 装饰器,装饰器多参数的使用(*arg, **kwargs),装饰器的调用顺序
一.#1.执行outer函数,并且将其下面的函数名,当作参数 #2.将outer的返回值重新赋值给f1 = outer的返回值 #3.新f1 = inner #4.func = 原f1 #!/usr/ ...
- python 中多个装饰器的执行顺序
python 中多个装饰器的执行顺序: def wrapper1(f1): print('in wrapper1') def inner1(*args,**kwargs): print('in inn ...
- python闭包与装饰器
转自小马哥: 闭包和装饰器充分体现了Python语法糖的优雅感觉. 在本文中,我们的实验要完成两个工作,一个是加法,一个是累计调用加法的次数,最普通的Python程序可以这么写: def valida ...
- python基础—函数装饰器
python基础-函数装饰器 1.什么是装饰器 装饰器本质上是一个python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能. 装饰器的返回值是也是一个函数对象. 装饰器经常用于有切 ...
- Python装饰器的调用过程
在Python学习的过程中,装饰器是比较难理解的一个应用.本人也在学习期间也遇到很多坑,现将装饰器的基本调用过程总结一下. 首先,装饰器用到了“闭包”,而“闭包”是学习装饰器的基础,所以在讲装饰器之前 ...
- Python使用装饰器自动调用父类__init__
众所周知,Python中class的构造函数实际是__new__(),但是如果我们执行p1=Point()的时候,不仅会调用Point的__new__方法,而且会调用Point的__init__方法. ...
随机推荐
- 【Laravel 】数据迁移文件常用方法速查表
一.存储引擎.字符编码相关操作 命令 描述 $table->engine = 'InnoDB'; 指定表的存储引擎(MySQL) $table->charset = 'utf8'; 指定数 ...
- Java基础单词总结
单词总结 Actualpayment --- 实际付款 Aggregatemount --- 合计金额 MemberPoints --- 会员积分 Management --- 管理 ...
- map 函数基本写法
map(需要对对象使用的函数,要操作的对象) 函数可以是自定义的,也可以是内置函数的,或者 lambda 匿名函数 操作的对象多为 可迭代对象可以是函数名的列表集合 2020-05-04
- C/C++编程笔记:C++入门知识丨认识C++面向过程编程的特点
一. 本篇要学习的内容和知识结构概览 二. 知识点逐条分析 1. 使用函数重载 C++允许为同一个函数定义几个版本, 从而使一个函数名具有多种功能, 这称之为函数重载. 像这样: 虽然函数名一样, 但 ...
- luogu3706 [SDOI2017]硬币游戏
LINK:硬币游戏 对于40分的暴力 构造出AC自动机 列出转移矩阵 暴力高消.右转上一篇文章. 对于100分 我们不难想到这个矩阵过大 且没有用的节点很多我们最后只要n个节点的答案 其他节点的答案可 ...
- intel:spectre&Meltdown侧信道攻击(一)
只要平时对安全领域感兴趣的读者肯定都听过spectre&Meltdown侧信道攻击,今天简单介绍一下这种攻击的原理( https://www.bilibili.com/video/av1814 ...
- OJ评测状态
Pending/Waiting 排队等待中 Pending Rejudge 答案重判中 Compiling 正在编译 Running/Judging 运行判断中 Accepted(AC) 程序通过 C ...
- Go语言系列(三)之数组和切片
<Go语言系列文章> Go语言系列(一)之Go的安装和使用 Go语言系列(二)之基础语法总结 1. 数组 数组用于存储若干个相同类型的变量的集合.数组中每个变量称为数组的元素,每个元素都有 ...
- .net core下获取自身服务器地址
网上的例子千篇一律都是Request.HttpContext.Connect.Connection.XX这种 或者依赖于IHttpContextAccessor的 而我的场景是在非控制器流程获取自身服 ...
- Android Studio同时监听多个Button实现activity跳转
MainActivity.java: package com.example.test; import android.content.Intent; import android.os.Bundle ...