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


    二、装饰器

          装饰器可以在给函数修改功能的同时并不改变这个函数本身。(以下用的都是python2.7)

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

    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() 本身,还能增加功能。

    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函数必须要有参数,而这个参数就是用来传递原来的函数用的。这个功能就是装饰器,等于减少了手动创建原函数的过程。

            (下面会出现一点问题)

    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

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

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


    参考:

      [1] Mr.Seven

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

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

  • 相关阅读:
    SIP 研究 API中文
    关于“ARC forbids explicit message send of release”错误
    Android获取屏幕尺寸和密度
    ScrollView 判断滑动到底部
    搭建JAVA版的webService
    MTK 开发
    android 2D动画实现
    android notification详解
    android 监听电话来去电
    SharePoint
  • 原文地址:https://www.cnblogs.com/Jomini/p/8568483.html
Copyright © 2020-2023  润新知