ironpython3发布时间_IronPython0.9.3发布了 —— 介绍一下Decorator
上周五就已经从IronPython Team发出的Mail中得知IronPython又发布了新版本——0.9.3。慵懒的周末让偶怠慢了跟踪报道,真不好意思了。不过也正好有了时间来酝酿一下这篇Post该写些什么,而不致于空洞无物。
在短短的不到一个月的时间里就发布了新的版本,改动果然如我猜想的那样并不是很大,主要是集中在修复与Closure相关的bugs。大家从IronPython的Workspace中可以看到Release Notes并且下载到最新的版本。虽然这次的改动并不算太大,而且与我最近关注的Python特性也没有太大关系,但是一个看得见的小改进让我开心不已——Decorator的bug修复了,几个原来无法正确运行的程序总算让我看到了期待的运行结果!0.9.2中实现的Decorator给我的感觉就像是半成品,让我没了兴趣。而新版本中的Decorators总算焕然一新,让我精神为之振奋,而Decorator也顺理成章地成为了这篇Post的主角。
Decorator是Python2.4中引入的新特性,它的原意是为了能够实现一般OO语言中的static方法或者说是类方法。然而在实际应用当中,它的应用范围则是非常广。为了了解Decorator,我们先来看一段简单的代码:
第一部分:
>>>def decorate(func):
print func.func_name
>>>@decorate
def test():
print"test function"
#以上代码等价于 decorate(test)
test
>>>test() # test这个function在全局范围不可见
Traceback (most recent call last):
atAttributeError:'NoneType'objecthas no attribute'__call__'
------------------------------------------------
第二部分:
>>>def decorate(source, dest):
print source, dest
def wrapper(func):
pass
returnwrapper
>>>@decorate("source","dest")
def test():
print"test function"
#以上代码等价于 decorate("source","dest")(test)source dest
从以上代码可以看出Decorator本身就是一个function,它在语法上的定义跟一般function是没有区别的;Decorator在使用时通过@来表示;被Decorator修饰的实体是function对象。虽然Decorator在语法上与一般的function并无二致,但是其定义的内容和参数则是有考究的。我把Decorator看作是一个可以接受function对象为参数的特殊function,Decorator在定义的时候是必须带参数的。Decorator在使用的时候有两种方式,带参数和不带参数。使用方式不同也决定了Decorator在定义上的不同。当Decorator在使用的时候不带参数,那么其定义就有且仅有一个参数,这个参数所对应的实参就是被修饰的function,如以上代码第一部分所示;当Decorator在使用的时候带参数的话,那么其定义所包含的参数个数与使用时是一致。在这种情况下,Decorator定义的限制就比较多了,它必须包含function,并且要将该function作为Decorator的返回值,如以上代码中第二部分所示。被Decorator修饰的function就像是匿名函数一样,虽然有function名,却无法通过function名调用到该function。因此,以上的示例代码是没有什么实际意义的,只是为了方便说明问题。
一个真正有实际作用的Decorator通常都是对传入的function对象进行处理后并返回或者创建一个新的function对象并返回。不管怎样,一个有用的Decorator都会返回一个function对象,这样才能在使用了Decorator之后可以调用到一个修饰后的function。具体的可以参考limodou所写的decorator的使用一文中decorator函数的定义部分。
回头再看看自己写的东西,似乎越说越复杂了,其实Decorator是一个很简单的概念,它只不过是一个可以修改function的function罢了。以下是不使用Decorator与使用Decorator来实现相同效果的代码,大家可以从中看到Decorator只是一个简单概念的演化而已。
>>>def test():
pass
>>>def decorate(func):
func.author="FantasySoft"
returnfunc
>>>decorate(test)
>>>test.author
'FantasySoft'-------------------------------------------
>>>def decorate(func):
func.author="FantasySoft"
returnfunc
>>>@decorate
def test():
pass
>>>test.author
'FantasySoft'
把修改其他function的function独立出来,作用并不是那么的明显。但是这样做可以将一些公共模块归类为Decorator,使得代码组织更为清晰。而在多层函数调用的情况下,使用Decorator的语法也会显得简单明了。其他的Motivation,大家可以参考Decorators for Functions and Methods(PEP 318) 。
分享到:
2005-10-17 15:44
浏览 839
评论
ironpython3发布时间_IronPython0.9.3发布了 —— 介绍一下Decorator相关推荐
- linux debian 8.3 发布时间,Robolinux 8.3 发布下载,基于 Debian 的 Linux 发行
Robolinux 8.3 发布下载,此版本主要添加了: 1. Spotify: Music streaming, podcast and video service 2. Photo Filmstr ...
- android最新版本和发布时间,Android12正式版发布时间-什么时候更新
Android12开发者版本已正式推送,那么Android12正式版将会在什么时候上市呢,更新时间是多久,接下来小编就为大家带来了,Android12正式版的相关信息,一起看看吧! 一.更新时间 An ...
- php5.3 发布时间,php 5.3发布了~
在Windows系统上使用Apache2.2上模块化安装PHP5.3 PHP5.3增加了一些功能,如namespace,静态迟绑定等. 1 下载php5.3和apache2.2 php5.3一定要下载 ...
- iOS各版本发布时间和特点
iOS各版本发布时间和特点 iOS9--发布时间2015年6月9日 特性:(更新于开发的内容) 1.iOS9系统发送的网络请求将统一使用HTTPs,将不再默认使用HTTP等不安全的网络协议,而默认采用 ...
- JDK各个版本发布时间
JDK各个版本发布时间 JDK版本 名称 发布时间 1.0 Oak(橡树) 1996-01-23 1.1 1997-02-19 1.2 Playground(运动场) 1998-12-04 1.3 K ...
- 华为最新款手机2021款鸿蒙,华为最新款手机2021款 华为P50发布时间
2021华为最新款手机 华为P50发布时间 华为仍旧会发布P50系列,只不过遇到的困难可能会更大.今天数码博主@菊厂影业Fans 针对华为P50系列进行了多轮爆料.该博主表示,P50系列的替代方案已经 ...
- dedeCMS修改文章更新发布时间问题
今天在dedeCMS系统中,修改或文章时发现,只要提交以后,文章发布时间便是当前时间.但有时候修改文章以后并不想把文章发布时间也更新成修改时间.我希望的是,修改文章不对时间做更改保持文章原有发布时间, ...
- vMware vSphere 5.0发布时间
vMware vSphere 5.0正式版发布时间是2011年8月22日 转载于:https://blog.51cto.com/ilgl666/631328
- 英特尔5G基带发布时间提前半年以上,但2019款iPhone支持5G仍有点悬
雷锋网消息,英特尔今天发布了一款为手机.PC和宽带接入网关等设备提供5G连接而优化的多模调制解调器XMM 8160,该调制解调器将支持高达6Gbps的峰值速率.据悉,英特尔将该款调制解调器的发布日期提 ...
最新文章
- 计算机丢失mfc120u.dll,mfc120u.dll丢失怎么修好
- 古典概型中的几何体计数
- 浅析php学习的路线图
- 使用jxl来读取Excel中的数据
- php时间函数引入,PHP日期和时间函数的使用示例详解
- 【android】string.xml中的一些错误
- pytorch自定义loss损失函数
- (一)问候 Log4j 你好
- C#------如何获取本机IP地址
- zmq是基于tcp实现的吗_zmq消息传输基本功能的实现、传输模式
- [网络安全提高篇] 一一三.Powershell恶意代码检测 (1)论文总结及抽象语法树(AST)提取
- ENVI监督分类错误:分离度为0.00000解决办法
- 前端三剑客---HTML
- 你知道如何从零开始学c++游戏编程吗
- VDI(Virtual Desktop Infrastructure)云桌面使用笔记
- SMS发送流程 Android2.2
- Java使用当前日期加四位数实现每日自增单号工具类
- 文件宝局域网传输/播放功能Windows10系统经验贴(感谢文件宝用户@卡卡罗特 和@24K 純情)...
- ie html5 支持相机,HTML5IE浏览器兼容问题以及图像元素
- matlab能做什么设计,MATLAB中GUI设计领悟
热门文章
- Shell脚本中date的用法小结
- 不要再问类似如C++和C#谁好谁坏,谁更有前景的问题
- matlab显示灰度值的概率,求Matlab统计灰度值的代码
- java tomcat数据库连接池,tomcat 数据库连接池拿不到连接
- mate7 刷机 android 7,Mate7 四大版本完整稳定版刷机包大集合!
- wdatepicker不显示秒_为什么别人电脑开机只要3秒,你有固态硬盘却要等上18秒?...
- 诊所系统php,诊所管理系统
- Python零基础入门(四)——Python面向对象编程[学习笔记]
- fiddler重定向
- oracle 错误码1438,一次ora-01438错误的处理