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

  • ?为什么要使用装饰器

    • 在软件开发的过程中,我们发现经常用到重复的代码,这就大大的增加了开发的周期,为了使得开发更为高效,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开发中使用装饰器(一))