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 (<code object dec at 00BE74A0, file "decorator.py", line 1>)
      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 (<code object realfun at 00BE74E8, file "decorator.py", line 12>)

                     //将代表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的更多相关文章

  1. python中的decorator的作用

    1.概念 装饰器(decorator)就是:定义了一个函数,想在运行时动态增加功能,又不想改动函数本身的代码.可以起到复用代码的功能,避免每个函数重复性编写代码,简言之就是拓展原来函数功能的一种函数. ...

  2. 谈谈Python中的decorator装饰器,如何更优雅的重用代码

    众所周知,Python本身有很多优雅的语法,让你能用一行代码写出其他语言很多行代码才能做的事情,比如: 最常用的迭代(eg: for i in range(1,10)), 列表生成式(eg: [ x* ...

  3. python中完善decorator

    @decorator可以动态实现函数功能的增加,但是,经过@decorator“改造”后的函数,和原函数相比,除了功能多一点外,有没有其它不同的地方? 在没有decorator的情况下,打印函数名: ...

  4. 浅析python中的装饰器decorator

    最近学习python,其中decorator比较难理解,遂写一篇来总结供后续查阅. 定义一个函数,想在运行时动态的改变函数的功能,又不想改变函数本身的代码,可以使用高阶函数(可以使用函数作为参数) 装 ...

  5. python中decorator

    先讲一下python中的@符号 看下面代码 @f @f2 def fun(args, args2, args3, args4, ……): pass 上面代码相当于 def fun(args, args ...

  6. decorator在Python中的作用

    decorator(装饰器)在python中作用,可以起到代码复用,也可以起到AOP(面向横切面)的作用. 另外很重要的一点应该就是function在python的世界中是作为一等公民存在的. 在py ...

  7. python中decorator的用法及原理(一)

    0. 概念 什么叫装饰器,其实也可以叫做包装器.即对于一个既有的函数func(args),在调用它之前和之后,我们希望都做一些事情,把这个函数包装起来. Python中的装饰器分为两类:函数装饰器和类 ...

  8. python中的装饰器decorator

    python中的装饰器 装饰器是为了解决以下描述的问题而产生的方法 我们在已有的函数代码的基础上,想要动态的为这个函数增加功能而又不改变原函数的代码 例如有三个函数: def f1(x): retur ...

  9. [转] Python中的装饰器(decorator)

    想理解Python的decorator首先要知道在Python中函数也是一个对象,所以你可以 将函数复制给变量 将函数当做参数 返回一个函数 函数在Python中和变量的用法一样也是一等公民,也就是高 ...

随机推荐

  1. LL(1)文法

    <源程序>→<外部声明>|<外部声明><函数体> <外部申明>→<头文件><函数声明>|其他声明 <函数体&g ...

  2. wamp下多域名配置问题

    1.找到wamp安装目录的apache安装目录 找到 httpd.conf文件 例如我安装的目录为 E:\wamp\bin\apache\apache2.2.8\conf\httpd.conf 也可以 ...

  3. jira任务批量操作示例

    1. 获取jira任务编号 使用字段提取工具获取编号,如WQBNEWSDLDL-347,WQBNEWSDLDL-348: 字段提取正则表达式:(?<2>[\[[](?<1>[A ...

  4. 使用SpringMVC集成SpringSession的问题

    最近在使用SpringSession时遇到一个问题,错误日志如下: Exception sending context initialized event to listener instance o ...

  5. git学习--常用命令

    1.初始化一个 Git 仓库 git init <directory> //参数 directory:作为Git仓库的目录 2.从Git 仓库中拷贝项目 git clone <rep ...

  6. how-to-install-siege-on-centos-7

    https://www.joedog.org/siege-home/ https://roastahost.com/how-to-install-siege-on-centos-7/ (Works!) ...

  7. 为什么Pojo类没有注解也没有spring中配置<bean>也能够被加载到容器中。

    Spring的注入机制其实就是代替了new的这个过程(称为解耦). 写了一个Thread类,没有加注解@Component,但是可以正常运行,开始为了自圆其说,打通逻辑,猜测是StartThread中 ...

  8. OpenCV整体的模块架构

    之前啃了不少OpenCV的官方文档,发现如果了解了一些OpenCV整体的模块架构后,再重点学习自己感兴趣的部分的话,就会有一览众山小的感觉,于是,就决定写出这篇文章,作为启程OpenCV系列博文的第二 ...

  9. JSONObject put,accumulate,element的区别

    public Object put (Object key, Object value) 将value映射到key下.如果此JSONObject对象之前存在一个value在这个key下,当前的valu ...

  10. paper 119:[转]图像处理中不适定问题-图像建模与反问题处理

    图像处理中不适定问题 作者:肖亮博士 发布时间:09-10-25 图像处理中不适定问题(ill posed problem)或称为反问题(inverse Problem)的研究从20世纪末成为国际上的 ...