python decorator_python 中的decorator
python 中decorator的作用就是一个包装的作用,所谓包装指在执行真正的函数之前或者之后,我们可以有一些额外的发挥余地。
decorator形式如下
def dec(arg1):
print("dec",arg1)
def func_replace(func):
print("func_replace",func)
def call_real_func(*args,**kwargs):
print("call_real_func")
func(*args,**kwargs)
return call_real_func
return func_replace
@dec("abc")
def realfun(arg):
print("realfun",arg)
realfun("123")
"@"的作用,我们通过这份代码产生的python bytecode来弄清楚@的作用
F:\pyweb>python -m dis decorator.py
源码行号 字节码偏移 字节码 注释
1 0 LOAD_CONST 0 ()
3 MAKE_FUNCTION 0
6 STORE_NAME 0 (dec)
//到此为止是def dec(): 产生 代表dec PyFunction的字节码
12 9 LOAD_NAME 0 (dec) //加载 dec 对应的PyFunctionObject
12 LOAD_CONST 1 ('abc') //压入 'abc'到value-stack
15 CALL_FUNCTION 1 //调用函数,就是dec('abc'),然后建dec 返回的 func_replace压到 value stack
//到此相当于 dec('abc')
18 LOAD_CONST 2 ()
//将代表realfun的PyCodeObject压入value stack
21 MAKE_FUNCTION 0
//根据栈顶代表realfun的PyCodeObject生成 PyFunctionObject,返回之后,
//value stack的值为:PyFunctionObject(func_replace),PyFunctionObject(realfun)
24 CALL_FUNCTION 1
//调用func_replace(realfun) ,返回call_real_func 这个PyFunctionObject压入
//value stack
//到此相当于 dec('abc')(realfun)
27 STORE_NAME 1 (realfun) //替换掉 realfun
//到此相当于realfun=dec('abc')(realfun)
17 30 LOAD_NAME 1 (realfun)
33 LOAD_CONST 3 ('123')
36 CALL_FUNCTION 1
39 POP_TOP
40 LOAD_CONST 4 (None)
43 RETURN_VALUE
分析之后可以知道@的作用就是在调用dec之后又添加了一个调用,而且这个调用的格式是固定的是func( realfun)这种。
所以
@dec("abc")
def realfun(arg):
print("realfun",arg)
这个的实际作用是realfun=dec('abc')(realfun)。中间有一个产生PyFunctionObject,并且隐藏了调用dec返回PyFunctionObject的过程
另外有一种没有参数的decorator,他们省去了调用dec这一步,效果相当于realfun=dec(realfun);
python decorator_python 中的decorator相关推荐
- Python中的decorator装饰器使用方法
装饰器的运用是Python编程中的一项高级技巧,这里由浅入深,整理了12步入门Python中的decorator装饰器使用方法,需要的朋友可以参考下 装饰器(decorator)是一种高级Python ...
- python装饰器-Python——装饰器(Decorator)
1.什么是装饰器? 装饰器放在一个函数开始定义的地方,它就像一顶帽子一样戴在这个函数的头上.和这个函数绑定在一起.在我们调用这个函数的时候,第一件事并不是执行这个函数,而是将这个函数做为参数传入它头顶 ...
- 为什么在Python代码中需要装饰器
Python is praised for its clarity and syntactic sugariness. In this article, I will teach you to use ...
- Python的装饰器decorator
Python的装饰器decorator 作者:王大为 时间:2016-10-19 一.装饰器的本质 本质:装饰器本身就是一个函数,高阶函数+嵌套函数==>装饰器 原则: * 1.不能修改被装饰函 ...
- python调用什么函数实现对文件内容的读取_如何使用python语言中的方法对文件进行读写操作...
在我们使用python语言中的文件时,可以使用open()方法打开文件,close()方法关闭文件,read()方法读取文件内容,write()方法写入内容到文件中.下面利用几个实例说明文件读写方法, ...
- python图像中如何显示中文
python图像中如何显示中文 在开头加入这两行即可 from pylab import * mpl.rcParams['font.sans-serif'] = ['SimHei']
- 关于python缩进的描述中_关于Python程序中与“缩进”有关的说法中,以下选项中正确的是()...
关于Python程序中与"缩进"有关的说法中,以下选项中正确的是() 答:缩进在程序中长度统一且强制使用 同文学或同音乐主题的民歌,<_______>是其中之一.此曲经 ...
- python 类中定义类_Python中的动态类定义
python 类中定义类 Here's a neat Python trick you might just find useful one day. Let's look at how you ca ...
- Python培训分享:Python新版本中的6个新特性
Python在几年做了一个全面的升级,此次Python升级中有6个新特性,本期小编为大家介绍的Python培训教程就是关于介绍Python新版本中的6个新特性的,来看看下面的详细介绍. Python培 ...
最新文章
- 如何确定SharePoint 2007的一次增量爬网会处理多少条更新呢?
- RX学习笔记:正则表达式
- 《系统集成项目管理工程师》必背100个知识点-14项目章程的内容
- LeetCode 897 递增顺序搜索树
- eclipse项目红叉,Target runtime Apache Tomcat 6.0 is not defined
- 【算法竞赛学习】金融风控之贷款违约预测-特征工程
- url中向后台传递中文乱码解决方法
- Vue 定义组件模板的七种方式(一般用单文件组件更好)
- calico/node is not ready: BIRD is not ready: BGP not established with 172.19.77.23
- FlyMcu - 用于STM32芯片ISP串口程序一键下载的免费软件
- tensorflow2 搭建LeNet5训练MINST手写数字数据集并用c++ opencv4.5.5 DNN加载模型预测结果
- 高等数学--数学分析一
- windows 10 微软拼音输入法设置
- 安卓案例:利用视图翻页器实现引导页
- SpringBoot集成移动云MAS平台(SDK版本)
- 软件界面原型设计工具(Web):Axure RP
- 如何修改Win10的Windows Terminal的背景(带图文)
- wrf模式计算机配置,用WRF模型进行气象模拟入门(2)——WPS的配置与使用
- office 论文 页码_毕业论文word里面怎么弄以下这些页码?第一页不显示。 第二三页是I II ,四页开始以下是1234。求详细方法...
- MySQL之启动选项
热门文章
- 基于UML的面向对象分析与设计
- 深入认识javascript中的eval函数
- linux的lnmp环境,Ubuntu 16.04 LTS下LNMP环境配置简述
- oracle nowday,Java MonthDay now()用法及代码示例
- Ayoub's function CodeForces - 1301C(组合数学)
- mysql 原生 添加数据_手撸Mysql原生语句--增删改查
- 时间序列分析之:傅里叶变换找周期
- html的带分页的表格写法,Html表格分页
- 【计算机网络】ISO/OSI模型
- python下载图片 referer_Python 下载图片问题,谢谢先