zoukankan      html  css  js  c++  java
  • 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

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

  • 相关阅读:
    安装VMtools vim编辑器的使用 压缩包命令 Linux下的用户管理 (第三天)
    VM虚拟机安装 常用Linux命令 网卡配置 (第二天)
    数据库的交互模式 常用的dos命令 (第一天)
    Validate US Telephone Numbers FreeCodeCamp
    Arguments Optional FreeCodeCamp
    Everything Be True FreeCodeCamp
    Binary Agents FreeCodeCamp
    Steamroller FreeCodeCamp
    Drop it FreeCodeCamp
    Smallest Common Multiple FreeCodeCamp
  • 原文地址:https://www.cnblogs.com/Jomini/p/8568483.html
Copyright © 2011-2022 走看看