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

    什么是装饰器?

    • 装饰器:本质上是一个Python函数(python中函数就是对象),它可以让其他函数在不需要做任何代码变动的前提下,增加额外功能,装饰器的返回值也是一个函数对象。
    • 优点   :有了装饰器,我们就可以抽离出大量与函数功能本身无关的雷同代码并继续重用。
    • 装饰器就是把函数作为参数的函数。
    • 装饰器是Python2.4里引进的,所以若想使用装饰器,需要确保你的python版本>=2.4。
    • 装饰器使函数调用变慢了。

    首先明白如下代码的含义:

    #### 第一波 ####

    def foo():
        print 'foo'
     
    foo     #表示是函数
    foo()   #表示执行foo函数
     
    #### 第二波 ####
    def foo():
        print 'foo'
     
    foo lambda x1
     
    foo()   # 执行下面的lambda表达式,而不再是原来的foo函数,因为函数 foo 被重新定义了

    基于如下代码进行需求变更:

    ############### 基础平台提供的功能如下 ###############

    def f1():
        print 'f1'
     
    def f2():
        print 'f2'
     
    def f3():
        print 'f3'
     
    def f4():
        print 'f4' 
     
    ############### 业务部门A 调用基础平台提供的功能 ###############
     
    f1()
    f2()
    f3()
    f4()
     
     
    在如上代码基础上,即:对基础平台的所有功能进行重构,为平台提供的所有功能添加验证机制,即:执行功能前,先进行验证。
    实现方案如下(仅仅针对基础平台进行代码改动):
     
    ############### 基础平台提供的功能如下 ###############
     
            def w1(func):
        def inner():
            # 验证1
            # 验证2
            # 验证3
            return func()
        return inner
     
    @w1
    def f1():
        print 'f1'
    @w1
    def f2():
        print 'f2'
    @w1
    def f3():
        print 'f3'
    @w1
    def f4():
        print 'f4'

     针对上述修改,以f1为例,做详细分析:

    def w1(func):
        def inner():
            # 验证1
            # 验证2
            # 验证3
            return func()
        return inner
     
    @w1
    def f1():
        print 'f1'
     
    python解释器会从上到下解释代码,步骤如下:
    1. def w1(func):  ==>将w1函数加载到内存
    2. @w1

    没错,从表面上看解释器仅仅会解释这两句代码,因为函数在没有被调用之前其内部代码不会被执行@函数名 是python的一种语法糖。

    @w1
    def f1():
        print 'f1' 
    # 相当于:
    def f1():
        print 'f1' 
    f1 = w1(f1)

    如上例@w1内部会执行以下操作:

    • 执行w1函数,并将 @w1 下面的 函数 作为w1函数的参数,即:@w1 等价于 w1(f1)
      所以,内部就会去执行:
      def inner:
      #验证1/2/3
      return f1()
      return inner     # 返回的 inner,inner代表的是函数,非执行函数
      **其实就是将原来的 f1 函数塞进另外一个函数中**
    • 将执行完的 w1 函数返回值赋值给@w1下面的函数的函数名
      w1函数的返回值是:
      def inner:
      #验证
      return 原来f1()  # 此处的 f1 表示原来的f1函数
      然后,将此返回值再重新赋值给 f1,即:
      新f1 = def inner:
      #验证
      return 原来f1()
      所以,以后业务部门想要执行 f1 函数时,就会执行 新f1 函数,在新f1 函数内部先执行验证,再执行原来的f1函数, 即执行了验证的功能,又执行了原来f1函数的内容。

    一个函数可以被多个装饰器装饰吗?

    @a

    @b

    @c

    def f ():

    # 相当于

    f = a(b(c(f)))

     

    参考文档:https://www.cnblogs.com/2014-02-17/p/7070510.html

                       http://python.jobbole.com/86632/

  • 相关阅读:
    推荐阅读20100506
    Windows 7中使用任务计划和媒体播放器当闹钟
    推荐阅读20100517
    又遇IIS 7不能压缩js文件的问题
    推荐阅读20100523
    jQuery调用WCF服务时如何传递对象参数
    Execution permission cannot be acquired
    快乐出发
    推荐阅读20100509
    参加“全球互动娱乐专家讲坛”之“创业者与创业板”的收获
  • 原文地址:https://www.cnblogs.com/sunshine-blog/p/8304217.html
Copyright © 2011-2022 走看看