• 技术文章 >后端开发 >Python教程

    简单上手Python中装饰器的使用

    2016-06-06 11:12:50原创703
    Python的装饰器可以实现在代码运行期间修改函数的上下文, 即可以定义函数在执行之前进行何种操作和函数执行后进行何种操作, 而函数本身并没有任何的改变。

    这个看起来很复杂, 实际上应用到了我之前说过的闭包的概念, 仔细看一看, 其实并不复杂。

    首先, 我们先定义一个函数, 这个函数可以输出我的个人昵称:

    def my_name():
      print "Yi_Zhi_Yu"
    my_name() # Yi_Zhi_Yu
    
    

    那假如我需要在个人昵称输出前, 在输出我的个人uid呢, 当然, 要求是不改动现有的my_name函数, 这个时候就可以使用装饰器了

    首先, 装饰器也是个函数, 其次, 他需要接受一个参数,该参数表示了要被装饰的函数(即my_name):

    def my_info(func):
      def wrapper(*args, **params):
        print 218
        return func(*args, **params)
      return wrapper
    
    

    然后与相应的被装饰函数关联起来的方法就是使用@my_info写在被装饰函数的前面

    @my_info
    def my_name():
      print "Yi_Zhi_Yu"
    
    

    最后, 在执行my_name的时候, 就能既输出我的uid, 又能输出我的昵称了

    my_name()
    #218
    #Yi_Zhi_Yu
    
    

    在上面, 最让我们疑惑的是装饰器函数定义里面的wrapper函数, 装饰器本身返回的是wrapper函数的定义, 而wrapper中则定义了对被装饰函数(my_name)的调用, func表示的就是被装饰函数, 说白了, 装饰器只是把某个不得改动的函数(a)放到另一个函数(b)中, 在b里面调用a, 在调用前后就可以做所谓的看起来像装饰的工作了。
    my_info的最终返回的wrapper函数的定义, 并不是执行结果,只有当wrapper真正执行的时候, 才会真正的执行my_name方法, 这就是闭包时所说的内容。
    wrapper中的参数, 实际上则是传递给func(实际上是my_name)的参数

    因为装饰器也是个函数, 那么装饰器自己的能不能有参数传递呢。可以, 不过需要定义一个更高阶的函数, 也就是外面还要套一层函数, 比如, 我还要输出我的自定义的一个信息,需要传递参数

    def c_info(text):
      def my_info(func):
        def wrapper(*args, **params):
          print text
          print 218
          return func(*args, **params)
        return wrapper
      return my_info
    
     #使用装饰器
     @c_info("Tony")
     def my_name():
      print "Yi_Zhi_Yu"
    
     my_name()
     #Tony
     #218
     #Yi_Zhi_Yu
    
    

    与前面的那个装饰器相比, 仅仅是多了个外层, 内层也仅仅是增加了对外层传入参数(text)的调用

    总而言之, Python在函数定义中支持了对oop思想中的装饰器的实现, 其本质也只是使用了闭包的思路, 延迟调用, 并在调用前后增加自己的其他实现内容

    声明:本文原创发布php中文网,转载请注明出处,感谢您的尊重!如有疑问,请联系admin@php.cn处理
    专题推荐:Python 装饰器
    上一篇:python实现查找两个字符串中相同字符并输出的方法 下一篇:python计算一个序列的平均值的方法
    线上培训班

    相关文章推荐

    • 十个Python程序员易犯的错误• Socket编程实战• Python多线程编程(三):threading.Thread类的重要函数和方法• 详解Python的迭代器、生成器以及相关的itertools包• 分析在Python中何种情况下需要使用断言

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网