`

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):
   at 
<shell>
AttributeError: 
'NoneType' object has no attribute '__call__'

------------------------------------------------
第二部分:
>>> def decorate(source, dest):
     print source, dest
     def wrapper(func):
         pass
     
return wrapper

>>> @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"
     
return func

>>> decorate(test)
<function test at 0x000000000000002F>
>>> test.author
'FantasySoft'
-------------------------------------------  
>>> def decorate(func):
     func.author 
= "FantasySoft"
     
return func

>>> @decorate
 def test():
     pass

>>> test.author
'FantasySoft'

        把修改其他function的function独立出来,作用并不是那么的明显。但是这样做可以将一些公共模块归类为Decorator,使得代码组织更为清晰。而在多层函数调用的情况下,使用Decorator的语法也会显得简单明了。其他的Motivation,大家可以参考<!---->Decorators for Functions and Methods(PEP 318) 。

分享到:
评论

相关推荐

    Python 笔记源码——内含python后端&机器学习等.zip

    Python 笔记源码——内含python后端&机器学习等.zip Python 笔记源码——内含python后端&机器学习等.zip Python 笔记源码——内含python后端&机器学习等.zip Python 笔记源码——内含python后端&机器学习等.zip ...

    python小游戏——扫雷

    python小游戏——扫雷

    IronPython-2.7.5.zip

    这个特定的版本,"IronPython-2.7.5.zip",包含了IronPython 2.7.5的安装文件"IronPython-2.7.5.msi",这是一个Windows安装程序,用于在Microsoft Windows系统上部署IronPython环境。 IronPython的主要特性包括: ...

    python项目——智慧校园考试系统.zip

    python项目——智慧校园考试系统.zip python项目——智慧校园考试系统.zip python项目——智慧校园考试系统.zip python项目——智慧校园考试系统.zip python项目——智慧校园考试系统.zip python项目——智慧校园...

    IronPython安装python第三方库的必须工具setuptools-py2.7.egg

    然而,对于IronPython——一个基于.NET框架的Python实现,安装过程稍有不同。"setuptools"是Python社区广泛使用的包管理工具,它使得安装、打包和分发Python软件变得简单。本文将详细讲解如何使用"IronPython"和...

    Python源码剖析——深度探索动态语言核心技术

    资源名称:Python源码剖析——深度探索动态语言核心技术资源截图: 资源太大,传百度网盘了,链接在附件中,有需要的同学自取。

    IronPython-2.7.4(内附样例程序)

    IronPython-2.7.4 是一个开源的Python实现,它是专门为.NET Framework和 Mono 平台设计的。这个版本的IronPython兼容Python 2.7的语法和库,允许开发者在.NET环境中运行Python代码,同时也支持与.NET组件的无缝集成...

    Word版,Python GUI设计——Tkinter菜鸟编程(上、中、下)

    ### Python GUI设计——Tkinter基础知识详解 #### 一、Tkinter简介 Tkinter是Python标准库中的一个图形用户界面(GUI)工具包,它提供了一系列的控件来帮助开发者快速构建用户界面。由于其易用性和跨平台特性,...

    在.Net6中调用IronPython实现动态执行脚本

    在.NET 6中调用IronPython来实现动态执行脚本是一项强大的功能,它允许程序员在运行时编写和执行Python代码,极大地增强了应用的灵活性。IronPython是一个开源的Python实现,它能够无缝集成到.NET环境中,使得.NET...

    python项目——Word助手.zip

    python项目——Word助手.zip python项目——Word助手.zip python项目——Word助手.zip python项目——Word助手.zip python项目——Word助手.zip python项目——Word助手.zip python项目——Word助手.zip python项目...

    python项目——玛丽冒险.zip

    python项目——玛丽冒险.zip python项目——玛丽冒险.zip python项目——玛丽冒险.zip python项目——玛丽冒险.zip python项目——玛丽冒险.zip python项目——玛丽冒险.zip python项目——玛丽冒险.zip python项目...

    python项目——超级画板.zip

    python项目——超级画板.zip python项目——超级画板.zip python项目——超级画板.zip python项目——超级画板.zip python项目——超级画板.zip python项目——超级画板.zip python项目——超级画板.zip python项目...

    python项目——企业编码管理.zip

    python项目——企业编码管理.zip python项目——企业编码管理.zip python项目——企业编码管理.zip python项目——企业编码管理.zip python项目——企业编码管理.zip python项目——企业编码管理.zip python项目——...

    ironpython.zip

    IronPython的1.0版本在2006年9月5日正式发布,标志着该项目进入了成熟阶段。自那时以来,它经历了多次更新和改进,增强了性能,优化了与.NET框架的集成,并修复了许多bug。IronPython的最新版本支持Python 3的语法...

    python项目——看图猜成语.zip

    python项目——看图猜成语.zip python项目——看图猜成语.zip python项目——看图猜成语.zip python项目——看图猜成语.zip python项目——看图猜成语.zip python项目——看图猜成语.zip python项目——看图猜成语....

    python项目——DIY字符画.zip

    python项目——DIY字符画.zip python项目——DIY字符画.zip python项目——DIY字符画.zip python项目——DIY字符画.zip python项目——DIY字符画.zip python项目——DIY字符画.zip python项目——DIY字符画.zip ...

    IronPython in Action.pdf

    这本书深入浅出地介绍了IronPython的基础知识以及如何在实际项目中发挥其优势。 首先,我们来了解IronPython的基本概念。IronPython结合了Python的简洁语法和.NET平台的强大功能,为开发者提供了高效开发的工具。与...

    IronPython-2.7.7.msi 金蝶云 调试python脚本环境搭建。

    标题中的"IronPython-2.7.7.msi"指的是IronPython的一个版本,这是一个开源的Python实现,可以在.NET Framework上运行。它允许开发者使用Python语言编写应用程序,同时利用.NET平台的强大功能。金蝶云,另一方面,是...

    Professional IronPython.pdf

    本书详细介绍了IronPython的基础知识及其高级应用,适合希望深入掌握IronPython编程语言的专业人士阅读。 #### 二、主要内容概览 本书共分为三个部分,涉及IronPython的各个方面,包括基础语法、高级特性以及与其他...

    python项目——BBS问答社区.zip

    python项目——BBS问答社区.zip python项目——BBS问答社区.zip python项目——BBS问答社区.zip python项目——BBS问答社区.zip python项目——BBS问答社区.zip python项目——BBS问答社区.zip python项目——BBS...

Global site tag (gtag.js) - Google Analytics