python装饰器简介—这一篇也许就够了(推荐)

  • Post category:Python

Python装饰器简介

概述

装饰器是Python语言中比较重要的一个概念。它是一种用于修改函数或其它类的东西函数,通常我们使用@decorator的语法糖形式来调用它。

装饰器的使用场景

在不改变已有函数或类的前提下,又想对它们进行修改或扩展,就可以使用装饰器。比如,我们可以使用装饰器增加函数的输出信息,或者修改函数的行为。

装饰器通常用于日志记录、性能测试以及事务处理等领域的函数调用前后自动化处理。

装饰器的实现方法

在 Python 中,装饰器是通过函数来实现的,它可以有以下特性:

  • 装饰器也是函数,可以把它理解成为一个包装器。
  • 装饰器用于包装另外一个函数或者对象,即可以接受一个函数(对象)作为参数。
  • 装饰器用于返回一个函数(对象)。

我们在使用装饰器时一般遵循以下的步骤:

  1. 定义一个装饰器函数
  2. 使用装饰器包装需要进行修饰的函数
  3. 使用被修饰的函数

装饰器的示例

下面我们通过两个例子来具体展示装饰器的使用方法:

示例一:增加函数执行信息

我们可以通过装饰器增加函数的执行信息,如函数的执行时间,函数的名称等等。

from functools import wraps
import time

def decorator(func):
  @wraps(func)
  def wrapper(*args, **kwargs):
    print(f'{func.__name__} start')
    start_time = time.time()
    result = func(*args, **kwargs)
    end_time = time.time()
    print(f'{func.__name__} end, time elapsed: {end_time - start_time}')
    return result
  return wrapper

@decorator
def test_func():
  for i in range(10000000):
    pass

test_func()

输出结果为:

test_func start
test_func end, time elapsed: 0.6222889423370361

在此例子中,我们使用“@decorator”语法糖来完成test_func函数的修饰。当test_func函数被调用时,实际上是调用了wrapper函数,wrapper函数负责增加test_func函数的执行信息,最后将结果返回。

示例二:限制函数参数

装饰器也可以用来限制函数的参数,以确保函数的参数满足我们的需求。比如我们需要检验函数参数的类型是否正确,或者检验参数的值是否合法。

from functools import wraps

def parameter_check(types):
  def decorator(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
      for i, arg in enumerate(args):
        if not isinstance(arg, types[i]):
          raise TypeError('incorrect parameter type')
      return func(*args, **kwargs)
    return wrapper
  return decorator

@parameter_check([int, int])
def test_func(a, b):
  print(a + b)

test_func(1, 2)
test_func('a', 2)

输出结果为:

3
TypeError: incorrect parameter type

在此例子中,我们使用“@parameter_check([int, int])”语法糖来完成test_func函数的修饰。当test_func函数被调用时,实际上是调用了wrapper函数,wrapper函数负责检查传入的参数类型是否正确,如果不正确,则报错。