Python无参装饰器
需求:想要在test_func函数前后执行一些代码
1.第一步(定义函数,将调用原函数,使用新函数替换)
def test_func(): return 'test_func' def test_wrapper_func(): print 'before' rt = test_func() print 'after' return rt print test_wrapper_func()
2.第二步(原函数可以定义参数)
def test_func(): return 'test_func' def test_wrapper_func(*args, **kwargs): print 'before' rt = test_func(*args, **kwargs) print 'after' return rt print test_wrapper_func()
3.第三步(定义工厂函数,返回wapper函数)
def test_func(): return 'test_func' def test_wrapper_func(*args, **kwargs): print 'before' rt = test_func(*args, **kwargs) print 'after' return rt def test_wrapper(): return test_wrapper_func test_wrapper_func_temp = test_wrapper() print test_wrapper_func_temp == test_wrapper_func print test_wrapper_func_temp() print test_wrapper_func()
4.第四步(去掉共有的wapper函数,放在工厂函数内部)
def test_func(): return 'test_func' def test_wrapper(): def wrapper(*args, **kwargs): print 'before' rt = test_func(*args, **kwargs) print 'after' return rt return wrapper test_wrapper_func = test_wrapper() print test_wrapper_func()
5.第五步(可以为所有函数添加同一功能前后执行代码)
def test_func() return 'test_func' def test_wrapper(func): def wrapper(*args, **kwargs): print 'before' rt = func(*args, **kwargs) print 'after' return rt return wrapper test_wrapper_func = test_wrapper(test_func) print test_wrapper_func()
6.第六步(使用装饰器)
def test_wrapper(func): def wrapper(*args, **kwargs): print 'before' rt = func(*args, **kwargs) print 'after' return rt return wrapper @test_wrapper def test_func(): return 'test_func' print test_func()
7.第七步(修正多个装饰器时,使用函数fun名称问题)
from functools import wraps def test_wrapper(func): @wraps(func) def wrapper(*args, **kwargs): print 'before' rt = func(*args, **kwargs) print 'after' return rt return wrapper @test_wrapper def test_func(): return 'test_func' print test_func()
Python学习群:238757010
Python无参装饰器的更多相关文章
- python语法糖之有参装饰器、无参装饰器
python的装饰器简单来说就是函数的一种形式,是为了扩展原来的函数功能而设计的. 装饰器的特别之处在于它的返回值也是一个函数,可以在不改变原有函数代码的基础上添加新的功能 # 先定义一个函数及引用# ...
- PYTHON-有参装饰器,无参装饰器,语法糖
装饰器 装饰器就是闭包函数的一种应用场景 一 为何要用装饰器 #开放封闭原则:对修改封闭,对扩展开放 二 什么是装饰器 装饰器他人的器具,本身可以是任意可调用对象,被装饰者也可以是任意可调用对象. 强 ...
- day11有参装饰器,无参装饰器
今日内容 1.有参装饰器 2.无参装饰器 什么是装饰器? 用来为被装饰对象添加新功能的工具. 注:装饰器可以是任意可调用对象,被装饰对象也可以是任意可调用对象. 为何要用装饰器? 开放封闭原则:对修改 ...
- python 有参装饰器与迭代器
1.有参装饰器 模板: def auth(x): def deco(func): def timmer(*args,**kwargs ): res = func(*args,**kwargs ) re ...
- python带参装饰器的改良版
简单点就是这种 def deco2(param=1): def _deco2(fun): def __deco2(*args, **kwargs): print (param) fun(*args, ...
- python函数之闭包函数与无参装饰器
一.global与nonlocal #global x = 1 def f1(): global x # 声明此处是全部变量x x = 2 print(x) f1() # 调用f1后,修改了全局变量x ...
- Python练习-无参装饰器的正确打开方式
import time def DecoUserPrint(UserFunc):#定义一个DecoUserPrint接收参数的多重方法 def DecoPrint(): StartTime = tim ...
- python中的无参装饰器和有参装饰器
python中的无参装饰器和有参装饰器 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 装饰器特点: 1>.开放封闭原则,即对扩展是开放的,对修改时封闭的: 2>.装饰器 ...
- python基础语法8 叠加装饰器,有参装饰器,wraps补充,迭代器
叠加装饰器: 叠加装饰器 - 每一个新的功能都应该写一个新的装饰器 - 否则会导致,代码冗余,结构不清晰,可扩展性差 在同一个被装饰对象中,添加多个装饰器,并执行. @装饰1 @装饰2 @装饰3 de ...
随机推荐
- Java 系统学习梳理_【All】
Java基础 1. Java学习---JDK的安装和配置 2. Java学习---Java代码编写规范 2. Java学习---HashMap和HashSet的内部工作机制 3. Java学习---J ...
- vs2012配置
ogre1.9 http://m.blog.csdn.net/blog/u013025310/20869871 http://www.cnblogs.com/zhouxin/p/4258849.htm ...
- 面向对象程序设计_Task5_Calculator1.5.0
The 3rd part of the Calculator program _ FILE I/O 题目链接:第五次作业(计算器第三步) github链接:Calculator_1.5.0 第五次作业 ...
- debian 7 终端上无法调出输出法
debian 7 终端konsole上无法调出输出法,无法输入汉字的问题解决方案, export GTK_IM_MODULE=fcitxexport QT_IM_MODULE=fcitxexport ...
- [HAOI2015]按位或
题目 好神的题啊 我们发现我们求这个东西如果常规\(dp\)的话可以建出一张拓扑图来,但是边的级别高达\(3^n\),转移的时候还要解方程显然不能通过本题 我们考虑神仙的\(min-max\)容斥 设 ...
- html手机网页自适应宽度
#在head之间加如下代码即可 <meta name="viewport" content="width=device-width, initial-scale=1 ...
- Linux搜索查找命令
Linux搜索查找指令 find,用于在文件树中查找文件并作相应的处理 -name:按照文件名查找文件 -perm:按照文件权限查找文件 -user:按照文件属主来查找文件 -size:按照指定的文件 ...
- java学习笔记-JavaWeb篇三
63 JSTL_表达式操作64 JSTL_流程控制操作 65 JSTL_迭代操作 66 JSTL_URL操作67 JSTL_改写MVC案例68 Filter概述 69 创建HttpFilter 70 ...
- IE8 下处理select标签高度不居中
IE8: Chrome: 同样的代码可是在IE8下select的文字并不是垂直居中. 处理:给select的样式添加padding上下的内边距. 加line-height一点用都 ...
- ios学习路线—Objective-C(属性修饰符)
readonly: 此标记说明属性是只读的,默认的标记是读写,如果你指定了只读,在@implementation中只需要一个读取器.或者如果你使用@synthesize关键字,也是有读取器方法被解析. ...