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相关推荐

  1. Python中的decorator装饰器使用方法

    装饰器的运用是Python编程中的一项高级技巧,这里由浅入深,整理了12步入门Python中的decorator装饰器使用方法,需要的朋友可以参考下 装饰器(decorator)是一种高级Python ...

  2. python装饰器-Python——装饰器(Decorator)

    1.什么是装饰器? 装饰器放在一个函数开始定义的地方,它就像一顶帽子一样戴在这个函数的头上.和这个函数绑定在一起.在我们调用这个函数的时候,第一件事并不是执行这个函数,而是将这个函数做为参数传入它头顶 ...

  3. 为什么在Python代码中需要装饰器

    Python is praised for its clarity and syntactic sugariness. In this article, I will teach you to use ...

  4. Python的装饰器decorator

    Python的装饰器decorator 作者:王大为 时间:2016-10-19 一.装饰器的本质 本质:装饰器本身就是一个函数,高阶函数+嵌套函数==>装饰器 原则: * 1.不能修改被装饰函 ...

  5. python调用什么函数实现对文件内容的读取_如何使用python语言中的方法对文件进行读写操作...

    在我们使用python语言中的文件时,可以使用open()方法打开文件,close()方法关闭文件,read()方法读取文件内容,write()方法写入内容到文件中.下面利用几个实例说明文件读写方法, ...

  6. python图像中如何显示中文

    python图像中如何显示中文 在开头加入这两行即可 from pylab import * mpl.rcParams['font.sans-serif'] = ['SimHei']

  7. 关于python缩进的描述中_关于Python程序中与“缩进”有关的说法中,以下选项中正确的是()...

    关于Python程序中与"缩进"有关的说法中,以下选项中正确的是() 答:缩进在程序中长度统一且强制使用 同文学或同音乐主题的民歌,<_______>是其中之一.此曲经 ...

  8. python 类中定义类_Python中的动态类定义

    python 类中定义类 Here's a neat Python trick you might just find useful one day. Let's look at how you ca ...

  9. Python培训分享:Python新版本中的6个新特性

    Python在几年做了一个全面的升级,此次Python升级中有6个新特性,本期小编为大家介绍的Python培训教程就是关于介绍Python新版本中的6个新特性的,来看看下面的详细介绍. Python培 ...

最新文章

  1. 如何确定SharePoint 2007的一次增量爬网会处理多少条更新呢?
  2. RX学习笔记:正则表达式
  3. 《系统集成项目管理工程师》必背100个知识点-14项目章程的内容
  4. LeetCode 897 递增顺序搜索树
  5. eclipse项目红叉,Target runtime Apache Tomcat 6.0 is not defined
  6. 【算法竞赛学习】金融风控之贷款违约预测-特征工程
  7. url中向后台传递中文乱码解决方法
  8. Vue 定义组件模板的七种方式(一般用单文件组件更好)
  9. calico/node is not ready: BIRD is not ready: BGP not established with 172.19.77.23
  10. FlyMcu - 用于STM32芯片ISP串口程序一键下载的免费软件
  11. tensorflow2 搭建LeNet5训练MINST手写数字数据集并用c++ opencv4.5.5 DNN加载模型预测结果
  12. 高等数学--数学分析一
  13. windows 10 微软拼音输入法设置
  14. 安卓案例:利用视图翻页器实现引导页
  15. SpringBoot集成移动云MAS平台(SDK版本)
  16. 软件界面原型设计工具(Web):Axure RP
  17. 如何修改Win10的Windows Terminal的背景(带图文)
  18. wrf模式计算机配置,用WRF模型进行气象模拟入门(2)——WPS的配置与使用
  19. office 论文 页码_毕业论文word里面怎么弄以下这些页码?第一页不显示。 第二三页是I II ,四页开始以下是1234。求详细方法...
  20. MySQL之启动选项

热门文章

  1. 基于UML的面向对象分析与设计
  2. 深入认识javascript中的eval函数
  3. linux的lnmp环境,Ubuntu 16.04 LTS下LNMP环境配置简述
  4. oracle nowday,Java MonthDay now()用法及代码示例
  5. Ayoub's function CodeForces - 1301C(组合数学)
  6. mysql 原生 添加数据_手撸Mysql原生语句--增删改查
  7. 时间序列分析之:傅里叶变换找周期
  8. html的带分页的表格写法,Html表格分页
  9. 【计算机网络】ISO/OSI模型
  10. python下载图片 referer_Python 下载图片问题,谢谢先