装饰器

无参:
def deco(func):
    
def replaceFunc():     #定义一个内嵌函数,此函数包装了被装饰的函数,并提供额外操作的代码
        print "Enter decorator"     #进行额外操作
        return func()    #产生对被装饰函数的调用
    return replaceFunc   #由于返回的是这个新的内嵌函数,所以确保额外操作每次调用得以运行

@deco
def MyFunc():   #应用@deco修饰的方法
    print "Enter MyFunc"

MyFunc()     
#调用被装饰的函数

有参:
def decoWithArgs(arg):
    
"""由于有参数的decorator函数在调用时只会使用应用时的参数而不接收被装饰的函数做为参数,
        所以必须返回一个decorator函数, 由它对被装饰的函数进行封装处理
"""
    
def newDeco(func):    #定义一个新的decorator函数
        def replaceFunc():    #在decorator函数里面再定义一个内嵌函数,由它封装具体的操作
            print "Enter decorator"     #进行额外操作
            return func()    #对被装饰函数进行调用
        return replaceFunc
    
return newDeco    #返回一个新的decorator函数

@decoWithArgs(
"demo")
def MyFunc():    #应用@decoWithArgs修饰的方法
    print "Enter MyFunc"
    
MyFunc()    
#调用被装饰的函数

当我们对某个方法应用了装饰方法后, 其实就改变了被装饰函数名称所引用的函数代码块入口点,使其重新指向了由装饰方法所返回的函数入口点。由此我们可以用decorator改变某个原有函数的功能,添加各种操作,或者完全改变原有实现。

posted @ 2009-12-16 15:27  kid的笔记本  阅读(145)  评论(0编辑  收藏  举报