关于理解python的装饰器

就字义上来说,装饰器的功能就是把一个函数装饰成一个新的函数,当原先的函数被运行时,同时运行新旧两个函数。

def mission_1():
    print 'mission_1'
def mission_2():
    print 'mission_2'
def mission_3():
    print 'mission_3'
mission_1()
mission_2()
mission_3()

  

  几个最简单的函数,当函数mission_1()至mission_3被运行时,显示mission_1至mission3。现在要求不改动当前函数运行方法和不改动函数内容,增加一个mission_a的函数时,装饰器就有他的用武之地了。

def add_mission(arg):                         #2、只以mission_1为例,此时参数arg = mission_1
    def mission_a():                          #5、当运行mission_1()函数时,执行此函数,因为add_mission函数执行后,mission_a以返回值形式赋值给了mission_1
        print 'mission_a'
        arg()                                 #6、等价于运行了真正的mission_1()函数
    return mission_a                          #3、将mission_a返回值赋给mission_1,如果运行mission_1()函数,相当于运行mission_a()函数

@add_mission                                  #1、当py被运行,首先会在这里以mission_1为参数执行add_mission()函数
                                              #相当于后面被注释的mission_1 = add_mission(mission_1)
def mission_1():                              #7、真正的mission_1函数
    print 'mission_1'                         #8、最后才会运行此任务

@add_mission
def mission_2():
    print 'mission_2'
@add_mission
def mission_3():
    print 'mission_3'


#mission_1 = add_mission(mission_1)
mission_1()                                   #4、此处被运行时并非运行真正的mission_1(),因为此时mission_1己被重新赋值为mission_a,相当于mission_1=mission_a
#mission_2 = add_mission(mission_2)
mission_2()
#mission_3 = add_mission(mission_4)
mission_3()        

  注释部份的数字是以mission_1为例,说明程序运行的流程。

  也就是说,在这个例子中,装饰器的功能就是,相当于把mission_1()函数装饰为mission_a()函数,同时把mission_1()函数以参数形式装饰为arg()函数。

 

  

posted @ 2017-07-04 06:05  LASHxxxx  阅读(198)  评论(0编辑  收藏  举报