python(十一)面向切面编程AOP和装饰器

 

2、装饰器html

      装饰器能够在给函数修改功能的同时并不改变这个函数自己。(如下用的都是python2.7)python

      首先,在python里面函数是对象,在下面的函数里"fun"是函数也是对象能够传递给test。加括号才能执行函数[1]python2.7

def fun():
    print "run a test fun()"

fun()          #fun() 是执行函数
#输出 "run a test fun()"

test = fun     #fun   是函数,能够进行传递
test()         #test() 也能够执行函数
#输出 "run a test fun()"

     如今要给函数 fun() 修改增长一点功能, 可是又不改变fun() 这个函数自己,这时候能够用下面的 modify 函数对 fun() 进行调用,这函数

这样既不改变 fun() 自己,还能增长功能。spa

def fun():
    print "run a test fun()"

def modify(function):        #这里的参数function能够用传递函数
    print "modify"
    function()               #所以传递的参数能够在这里执行


modify(fun)    #在这传递函数fun()
#输出
#modify
#run a test fun()

test = modify
test(fun)
#输出
#modify
#run a test fun()

       如今把上面的代码用简洁的方式实现相同的功能,只要把@加上函数名放在要修改的函数前面就有相同的功能,注意用来修饰的函数也就是下面的modify函数必需要有参数,而这个参数就是用来传递原来的函数用的。这个功能就是装饰器,等于减小了手动建立原函数的过程。code

        (下面会出现一点问题)htm

def modify(function):
    print "modify"
    function()

@modify
def fun():
    print "run a test fun()"

fun()    #可是这里执行不能用fun()了,得用fun
#输出
#抛出异常fun()TypeError: 'NoneType' object is not callable
fun
#输出
#modify
#run a test fun()

     这里若是要用fun() 执行函数的话,得将modify 函数改变一下, 在modify 函数里的function返回,改为以下对象

def modify(function):
    print "modify"
    return function

@modify
def fun():
    print "run a test function"

fun()
#输出
#modify
#run a test function

       为何会出现上面问题呢,接下要讲讲这个@+函数名的语法糖的工做原理blog

      ...(暂时没有找到讲原理的参考文)io

 


参考:

  [1] Mr.Seven

      http://www.cnblogs.com/wupeiqi/articles/4980620.html

--------------------谢谢大佬打赏--------------------------

相关文章
相关标签/搜索