美文网首页
如何在python开发中使用装饰器(一)

如何在python开发中使用装饰器(一)

作者: panxd | 来源:发表于2017-07-04 22:53 被阅读0次
    • ?为什么要使用装饰器

      • 在软件开发的过程中,我们发现经常用到重复的代码,这就大大的增加了开发的周期,为了使得开发更为高效,python中主要特性之一就是装饰器。(修改/生成/包装经常使用的代码
    • ?如何自己编写一个装饰器函数

      • 有时候,我们会遇到这样的问题,事先已经写好某些函数,但是想要在这些函数的基础上添加一些额外的功能(登录验证/记录日志/生成时间戳
      • 定义一个装饰器函数:
    >>> import time
    >>> from functools import wraps
    >>> 
    >>> 
    >>> def timeabout(func):
        '''定义一个装饰器用来生成执行某函数需要的时间戳'''
        @wraps(func)
        def wrapper(self, *args, **kwargs):
            s = time.time()  #开始时间
            result = func(self, *args, **kwargs) #func指的未被装饰的原始函数
            e = time.time()  #结束时间
            print(func.__name__,e - s)  #打印两部分内容(被装饰的函数名,需要的时间戳)
            return result
        return wrapper
    
    
    • 使用此装饰器
    >>>@timeabout       #使用此装饰器对下列阶乘函数进行包装处理
          def factorial(n):      
          if n == 1:
              return 1
          else:
              return factorial(n-1)*n
    >>>
    >>> factorial(10)
    factorial 0.0
    factorial 0.05403733253479004   #经过装饰器处理的阶乘函数
    factorial 0.06404519081115723
    factorial 0.07304859161376953
    factorial 0.08205389976501465
    factorial 0.0930624008178711
    factorial 0.10106801986694336
    factorial 0.10907340049743652
    factorial 0.11607766151428223
    factorial 0.12308287620544434
    3628800       #阶乘函数的结果
    >>> 
    
    
    • 装饰器即函数,可以接受函数作为输入,并且返回一个新的函数作为输出。
    #方法一和方法二执行后效果一样
    #方法一
    @timeabout       
    def factorial(n):       
        if n == 1:
            return 1
        else:
            return factorial(n-1)*n
    
    #方法二
    
    ```python
    def factorial(n):       
        if n == 1:
            return 1
        else:
            return factorial(n-1)*n
    factorial = timeabout(factorial)
    
    • 装饰器内部创建了一个新的函数(如wrapper),*args, **kwargs用来接收任何形式的输入参数。如需了解python中的函数如何使用,请浏览本作者关于函数的文章。
    • 在此函数wrapper内部,需要调用原来的函数(需要装饰的函数),将其作为参数输入,并返回结果。
    • 可以添加额外的代码,实现其它的方法。
    • 新的函数(如wrapper)会作为此装饰器的结果返回,取代原来的函数。

    相关文章

      网友评论

          本文标题:如何在python开发中使用装饰器(一)

          本文链接:https://www.haomeiwen.com/subject/lqhocxtx.html