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 (<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的更多相关文章
- python中的decorator的作用
1.概念 装饰器(decorator)就是:定义了一个函数,想在运行时动态增加功能,又不想改动函数本身的代码.可以起到复用代码的功能,避免每个函数重复性编写代码,简言之就是拓展原来函数功能的一种函数. ...
- 谈谈Python中的decorator装饰器,如何更优雅的重用代码
众所周知,Python本身有很多优雅的语法,让你能用一行代码写出其他语言很多行代码才能做的事情,比如: 最常用的迭代(eg: for i in range(1,10)), 列表生成式(eg: [ x* ...
- python中完善decorator
@decorator可以动态实现函数功能的增加,但是,经过@decorator“改造”后的函数,和原函数相比,除了功能多一点外,有没有其它不同的地方? 在没有decorator的情况下,打印函数名: ...
- 浅析python中的装饰器decorator
最近学习python,其中decorator比较难理解,遂写一篇来总结供后续查阅. 定义一个函数,想在运行时动态的改变函数的功能,又不想改变函数本身的代码,可以使用高阶函数(可以使用函数作为参数) 装 ...
- python中decorator
先讲一下python中的@符号 看下面代码 @f @f2 def fun(args, args2, args3, args4, ……): pass 上面代码相当于 def fun(args, args ...
- decorator在Python中的作用
decorator(装饰器)在python中作用,可以起到代码复用,也可以起到AOP(面向横切面)的作用. 另外很重要的一点应该就是function在python的世界中是作为一等公民存在的. 在py ...
- python中decorator的用法及原理(一)
0. 概念 什么叫装饰器,其实也可以叫做包装器.即对于一个既有的函数func(args),在调用它之前和之后,我们希望都做一些事情,把这个函数包装起来. Python中的装饰器分为两类:函数装饰器和类 ...
- python中的装饰器decorator
python中的装饰器 装饰器是为了解决以下描述的问题而产生的方法 我们在已有的函数代码的基础上,想要动态的为这个函数增加功能而又不改变原函数的代码 例如有三个函数: def f1(x): retur ...
- [转] Python中的装饰器(decorator)
想理解Python的decorator首先要知道在Python中函数也是一个对象,所以你可以 将函数复制给变量 将函数当做参数 返回一个函数 函数在Python中和变量的用法一样也是一等公民,也就是高 ...
随机推荐
- 快速原型设计工具-Axure RP的介绍及简单使用(生产初期向客户展示设计产品的原型-也就是展示产品)
啧啧~~ 给大家介绍一款超棒的原型设计工具--美国Axure Software Solution公司旗舰产品Axure RP 这款工具通俗的说呢,就是在项目整体需求考察后对整体设计一个简要性概括!设计 ...
- 从PowerDesigner表字段的Name到EF实体类属性的Display Name(根据PowerDesigner生成EF实体类中文注释和验证元数据)
第一步:将PowerDesigner表字段的中文Name填入Comment中:工具-Execute Commands-Edit/Run Script... '********************* ...
- Nginx location 匹配顺序整理
Nginx location模块整理 具体的Nginx安装就不在这里描述了,这里只是为了对location的描述 Nginx环境 a. 查看当前系统cat /etc/redhat-release [r ...
- MySQL 联合索引详解
MySQL 联合索引详解 联合索引又叫复合索引.对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分.例如索引是key index (a,b,c ...
- centos6.4 挂载新盘并移动mysql数据目录
1 centos 挂载新盘并格式化 以vmware workstation12 中安装的centos6. 虚拟机为例进行演示 关机,添加硬盘 开机,格式化硬盘,并挂载 通过命令查看硬盘 fdisk – ...
- 探索模拟angular的双向绑定
前言 本次探索的demo是基于jquery写的,毕竟jquery提供了强大的选择器,用惯了就离不开它了!angular的双向绑定实在是有点精深,本次探索只实现了文本的双向绑定. View-Model ...
- Mongodb在Linux下的安装和启动和配置
第一步:下载mongodb安装包,下载版本:2.0.2-rc2 下载链接: http://fastdl.mongodb.org/linux/mongodb-linux-i686-2.0.1.tgz 第 ...
- 最新IP地址数据库Dat格式-高性能高并发版(2017年1月)
最新IP地址数据库->Dat格式 高性能格式->qqzeng-ip.dat 国内版-20170101-Dat 版 国外版-20170101-Dat 版 ...
- Xubuntu VNC Xfce4
sudo mousepad ~/.vnc/xstartup #!/bin/sh # Uncomment the following two lines for normal desktop: unse ...
- 读书笔记 --TCP :传输控制协议(二)
TCP建立连接 请求端(客户端)发送一个SYN指明客户端打算连接的服务器端口号,以及初始序列号. 服务端发回包含服务器的初始序号的SYN报文段作为应答.同时,将确认序号设置为客户的ISN加1以对客户的 ...