上周五就已经从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相关推荐

  1. linux debian 8.3 发布时间,Robolinux 8.3 发布下载,基于 Debian 的 Linux 发行

    Robolinux 8.3 发布下载,此版本主要添加了: 1. Spotify: Music streaming, podcast and video service 2. Photo Filmstr ...

  2. android最新版本和发布时间,Android12正式版发布时间-什么时候更新

    Android12开发者版本已正式推送,那么Android12正式版将会在什么时候上市呢,更新时间是多久,接下来小编就为大家带来了,Android12正式版的相关信息,一起看看吧! 一.更新时间 An ...

  3. php5.3 发布时间,php 5.3发布了~

    在Windows系统上使用Apache2.2上模块化安装PHP5.3 PHP5.3增加了一些功能,如namespace,静态迟绑定等. 1 下载php5.3和apache2.2 php5.3一定要下载 ...

  4. iOS各版本发布时间和特点

    iOS各版本发布时间和特点 iOS9--发布时间2015年6月9日 特性:(更新于开发的内容) 1.iOS9系统发送的网络请求将统一使用HTTPs,将不再默认使用HTTP等不安全的网络协议,而默认采用 ...

  5. JDK各个版本发布时间

    JDK各个版本发布时间 JDK版本 名称 发布时间 1.0 Oak(橡树) 1996-01-23 1.1 1997-02-19 1.2 Playground(运动场) 1998-12-04 1.3 K ...

  6. 华为最新款手机2021款鸿蒙,华为最新款手机2021款 华为P50发布时间

    2021华为最新款手机 华为P50发布时间 华为仍旧会发布P50系列,只不过遇到的困难可能会更大.今天数码博主@菊厂影业Fans 针对华为P50系列进行了多轮爆料.该博主表示,P50系列的替代方案已经 ...

  7. dedeCMS修改文章更新发布时间问题

    今天在dedeCMS系统中,修改或文章时发现,只要提交以后,文章发布时间便是当前时间.但有时候修改文章以后并不想把文章发布时间也更新成修改时间.我希望的是,修改文章不对时间做更改保持文章原有发布时间, ...

  8. vMware vSphere 5.0发布时间

    vMware vSphere 5.0正式版发布时间是2011年8月22日 转载于:https://blog.51cto.com/ilgl666/631328

  9. 英特尔5G基带发布时间提前半年以上,但2019款iPhone支持5G仍有点悬

    雷锋网消息,英特尔今天发布了一款为手机.PC和宽带接入网关等设备提供5G连接而优化的多模调制解调器XMM 8160,该调制解调器将支持高达6Gbps的峰值速率.据悉,英特尔将该款调制解调器的发布日期提 ...

最新文章

  1. 计算机丢失mfc120u.dll,mfc120u.dll丢失怎么修好
  2. 古典概型中的几何体计数
  3. 浅析php学习的路线图
  4. 使用jxl来读取Excel中的数据
  5. php时间函数引入,PHP日期和时间函数的使用示例详解
  6. 【android】string.xml中的一些错误
  7. pytorch自定义loss损失函数
  8. (一)问候 Log4j 你好
  9. C#------如何获取本机IP地址
  10. zmq是基于tcp实现的吗_zmq消息传输基本功能的实现、传输模式
  11. [网络安全提高篇] 一一三.Powershell恶意代码检测 (1)论文总结及抽象语法树(AST)提取
  12. ENVI监督分类错误:分离度为0.00000解决办法
  13. 前端三剑客---HTML
  14. 你知道如何从零开始学c++游戏编程吗
  15. VDI(Virtual Desktop Infrastructure)云桌面使用笔记
  16. SMS发送流程 Android2.2
  17. Java使用当前日期加四位数实现每日自增单号工具类
  18. 文件宝局域网传输/播放功能Windows10系统经验贴(感谢文件宝用户@卡卡罗特 和@24K 純情)...
  19. ie html5 支持相机,HTML5IE浏览器兼容问题以及图像元素
  20. matlab能做什么设计,MATLAB中GUI设计领悟

热门文章

  1. Shell脚本中date的用法小结
  2. 不要再问类似如C++和C#谁好谁坏,谁更有前景的问题
  3. matlab显示灰度值的概率,求Matlab统计灰度值的代码
  4. java tomcat数据库连接池,tomcat 数据库连接池拿不到连接
  5. mate7 刷机 android 7,Mate7 四大版本完整稳定版刷机包大集合!
  6. wdatepicker不显示秒_为什么别人电脑开机只要3秒,你有固态硬盘却要等上18秒?...
  7. 诊所系统php,诊所管理系统
  8. Python零基础入门(四)——Python面向对象编程[学习笔记]
  9. fiddler重定向
  10. oracle 错误码1438,一次ora-01438错误的处理