Python中的装饰器

页面导航:首页 > 软件编程 > C 语言 > Python中的装饰器

Python中的装饰器

来源:互联网 作者:脚本宝典 时间:2015-09-22 13:30 【

假定现有如下需求:已经定义了一个函数,想在运行时动态增加其功能,又不想改动函数本身的代码。应该如何实现呢?比如现在定义了f1函数如下:deff1(x):returnx*2printf1(5)那么,现在想
假定现有如下需求:
已经定义了一个函数,想在运行时动态增加其功能,又不想改动函数本身的代码。应该如何实现呢?
比如现在定义了f1函数如下:
  def f1(x):        return x*2    print f1(5)


那么,现在想加入一个打印日志的方法,打印出调用的是哪个方法的方法。一般做法是这样:
    def f1(x):        print 'call f1()'
        return x*2    print f1(5)


那有没有更简单明了的方法呢,我上篇博文中有写的高阶函数,那么我们想到高阶函数是可以把函数当参数并且可以返回函数的。那么,再次,那么,是不是可以接收一个函数,对其进行一定包装(比如此处加一个打印日志的功能),然后返回一个新函数呢?自然可以,请看:
    def new_fn(f):        def fn(x):            print 'call'+  f.__name__+'() by decorator'
            return f(x)        return fn
    f1=new_fn(f1)    print f1(5)

 
 
当然,Python给我们提供了语法糖,可以让代码看起来更简洁一些的调用。我们只需要[email protected],[email protected]就是这样:
    def new_fn(f):        def fn(x):            print 'call' +f.__name__+'() using @'
            return f(x)        return fn

    @new_fn#这里也就是相当于上面的f1=new_fn(f1)弄成了这个样子,写习惯了就好了。
    def f1(x):        return x*2    print f1(5)  
 
 
那用装饰器有什么好处呢?
个人认为可以简化代码,[email protected]思想,类似于C#中MVC的Filter。


Tags:

文章评论

最 近 更 新
热 点 排 行
Js与CSS工具
代码转换工具

<