zoukankan      html  css  js  c++  java
  • Python中的装饰器

                                                        Python中的装饰器

    假定现有如下需求:

    已经定义了一个函数,想在运行时动态增加其功能,又不想改动函数本身的代码。应该如何实现呢?
    比如现在定义了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给我们提供了语法糖,可以让代码看起来更简洁一些的调用。我们只需要有装饰器函数前加上“@”,然后在后面做相应调用原函数的操作就可以了。也就是这样:
        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)
      

     
     
    那用装饰器有什么好处呢?
    个人认为可以简化代码,比如要打印日志加上“@log”就好。并且其有点AOP的思想,类似于C#中MVC的Filter。
     
     
     
     
     
  • 相关阅读:
    Python pip 下载速度慢? Windows 设置 国内源,用阿里云国内镜像加速
    Go timer 是如何被调度的?
    Go sync.Pool 浅析
    一次错误使用 go-cache 导致出现的线上问题
    golang面向对象分析
    一文完全掌握 Go math/rand
    这一次,彻底搞懂 Go Cond
    面试题:让你捉摸不透的 Go reslice
    当 Go struct 遇上 Mutex
    这可能是最容易理解的 Go Mutex 源码剖析
  • 原文地址:https://www.cnblogs.com/anmutu/p/4827807.html
Copyright © 2011-2022 走看看