python中decorator
先讲一下python中的@符号
看下面代码
- @f
- @f2
- def fun(args, args2, args3, args4, ……):
- pass
上面代码相当于
- def fun(args, args2, args3, args4, ……):
- pass
- fun = fun(f2(fun))
- def now():
- print('2016-06-03')
- n = now
- n2 = now()
- n2 #2016-06-03
- n() #2016-06-03
- #函数对象有一个name属性,可以拿到函数的名字
- print(n.__name__) #n这个变量指向的函数名为now,输出结果为now
- def log(func):
- def wrapper(*args, **kw):
- print('call %s():' % func.__name__)
- return func(*args, **kw)
- return wrapper
- @log
- def now():
- print('2016-06-03')
- now()
- #如果decorator本身需要传入参数,那就要编写一个返回decorator的高阶函数,比如自定义log的文本:
- def log(text):
- def decorator(func):
- def wrapper(*args, **kw):
- print('%s %s():' % (text, func.__name__))
- return func(*args, **kw)
- return wrapper
- return decorator
- @log('rain:')
- def now():
- print('2016-06-03')
- now()
- #但是像上面那样优化,装饰后的函数的__name__已经从now变成了wrapper
- print(now.__name__) #可以看到now这个名字已经被改成了wrapper
- #为了防止依赖于签名的那些函数执行时出错,要把原来函数的__name__复制到wrapper中
- import functools
- def log(func):
- @functools.wraps(func)
- def wrapper(*args, **kw):
- print('call %s():' % func.__name__)
- return func(*args, **kw) #注意这里返回的只是一个函数名,并没有传入参数
- return wrapper
- @log #注意这里的也应该是一个函数名,如果看到传入某个参数的函数,那这个函数的返回值是一个函数
- def ff():
- print('fun is running……')
- ff() #只有编写函数之前加上@log,调用这个函数的时候才会直接调用log(ff())
- import functools
- #针对带参数的decorator
- def log(text):
- def decorator(func):
- @functools.wraps(func)
- def wrapper(*args, **kw):
- print('%s %s():' % (text, func.__name__)) #这里的格式,牢记牢记牢记,别出错了
- return func(*args, **kw)
- return wrapper
- @log('rain:')
- def func():
- print('i love rain')
python中decorator的更多相关文章
- python中decorator的用法及原理(一)
0. 概念 什么叫装饰器,其实也可以叫做包装器.即对于一个既有的函数func(args),在调用它之前和之后,我们希望都做一些事情,把这个函数包装起来. Python中的装饰器分为两类:函数装饰器和类 ...
- python 中的decorator
python 中decorator的作用就是一个包装的作用,所谓包装指在执行真正的函数之前或者之后,我们可以有一些额外的发挥余地. decorator形式如下 def dec(arg1): print ...
- 浅析python中的装饰器decorator
最近学习python,其中decorator比较难理解,遂写一篇来总结供后续查阅. 定义一个函数,想在运行时动态的改变函数的功能,又不想改变函数本身的代码,可以使用高阶函数(可以使用函数作为参数) 装 ...
- decorator在Python中的作用
decorator(装饰器)在python中作用,可以起到代码复用,也可以起到AOP(面向横切面)的作用. 另外很重要的一点应该就是function在python的世界中是作为一等公民存在的. 在py ...
- python中的decorator的作用
1.概念 装饰器(decorator)就是:定义了一个函数,想在运行时动态增加功能,又不想改动函数本身的代码.可以起到复用代码的功能,避免每个函数重复性编写代码,简言之就是拓展原来函数功能的一种函数. ...
- python中的装饰器decorator
python中的装饰器 装饰器是为了解决以下描述的问题而产生的方法 我们在已有的函数代码的基础上,想要动态的为这个函数增加功能而又不改变原函数的代码 例如有三个函数: def f1(x): retur ...
- [转] Python中的装饰器(decorator)
想理解Python的decorator首先要知道在Python中函数也是一个对象,所以你可以 将函数复制给变量 将函数当做参数 返回一个函数 函数在Python中和变量的用法一样也是一等公民,也就是高 ...
- python中编写无参数decorator
Python的 decorator 本质上就是一个高阶函数,它接收一个函数作为参数,然后,返回一个新函数. 使用 decorator 用Python提供的 @ 语法,这样可以避免手动编写 f = de ...
- python2.7高级编程 笔记二(Python中的描述符)
Python中包含了许多内建的语言特性,它们使得代码简洁且易于理解.这些特性包括列表/集合/字典推导式,属性(property).以及装饰器(decorator).对于大部分特性来说,这些" ...
随机推荐
- VirtualBox 更改主机和虚拟机之间的鼠标切换热键
VirtualBox 主机和虚拟机之间的鼠标切换热键 是 Right Ctrl.一般用惯VM Ware的都不太习惯,那么怎么改变VirtualBox鼠标切换热键呢? 1.点击菜单栏的 管理--&g ...
- Qgis插件开发之Qgis源码学习
Qgis源码中的拖拽.zoomin/out等各个基础功能插件的实现位于qgis_app工程中. 具体头文件为: \QGIS\src\app\qgisapp.h 根据此类可以逐个找到Qgis的基础插件的 ...
- windows理论基础(一)
windows体系结构 一. 用户模式和内核模式 (user mode &kernel mode) Intel x86 处理器的体系结构定义了四种特权级,或特为四个环.来保护系统代码不会被低 ...
- 《转》使用JAVA如何对图片进行格式检查以及安全检查处理
本文出自冯立彬的博客,原地址:http://www.fenglibin.com/use_java_to_check_images_type_and_security.html 一.通常情况下,验证一个 ...
- label 和 legend标签的用法
label 和 legend标签的用法 label标准用法: 一般浏览器都支持 一般而言,label标签位于表单元素的前面或者后面,为控件提供说明文字 <label for="user ...
- mysql数据库字段区分大小写的设置方法
alter table t_25_thread_info modify column thread_id varchar(8) character set utf8 collate utf8_bin;
- Oracle的TPCC测试,原来也是个作弊的东西...
http://www.oaktable.net/content/sorted-hash-clusters-rip 根据Jonathan Lewis老先生的测试实例,发觉cluster 的sort功能, ...
- 在两个Android设备间通过UDP传输目录内文件
这两天下了一个使用UDP传输目录内文件的程序,发出来给大家一起看看,共同进步.有问题请指教. 由于udp丢包比较厉害,因此使用了自定义的内部协议,进行双方的确认. 程序跑起来后,看网络状况,有时候会一 ...
- WCF 双工通信
注释:本学习是参考Artech大神的资料: 在WCF 实现双工通信 在这里我就不介绍双工通信的概念了,我写博客的目的是检测自己掌握情况,看我wcf通信后,觉得纸上得来终觉浅,绝知此事要躬行. 我使用的 ...
- 支持iOS9 Universal links遇到的问题
记录为iOS9上的APP支持Universal links遇到的一些问题. 在Web服务器上传apple-app-site-association文件 必须支持HTTPS获取配置文件 文件名后不加.j ...