返回

装饰器的用法及实例

前端

用Python装饰器提升代码质量和效率

在Python中,装饰器是一种功能强大的工具,可以为类、方法和属性添加额外的功能,同时保持代码的优雅和简洁。通过使用装饰器,我们可以提高代码的可重用性和可维护性。

装饰器的定义和语法

装饰器本质上是一个函数,它接受一个函数作为参数,并在该函数执行之前或之后执行某些操作。其语法非常简单:

@decorator
def function():
  # 函数体

其中,@decorator表示将decorator函数作为装饰器使用。

装饰器的作用

装饰器的应用范围非常广泛,包括:

  • 打印日志信息
  • 测量函数执行时间
  • 验证函数参数
  • 添加缓存功能

装饰器实例

以下是一些装饰器的实例,展示其在实际应用中的强大功能:

  • 打印日志信息的装饰器:
def log(func):
  def wrapper(*args, **kwargs):
    print(f'Calling {func.__name__} with args {args} and kwargs {kwargs}')
    result = func(*args, **kwargs)
    print(f'Called {func.__name__} and got result {result}')
    return result
  return wrapper

@log
def add(a, b):
  return a + b

add(1, 2)

输出:

Calling add with args (1, 2) and kwargs {}
Called add and got result 3
  • 测量函数执行时间的装饰器:
import time

def timer(func):
  def wrapper(*args, **kwargs):
    start = time.time()
    result = func(*args, **kwargs)
    end = time.time()
    print(f'Function {func.__name__} took {end - start} seconds to execute')
    return result
  return wrapper

@timer
def sum(n):
  return sum(range(n))

sum(1000000)

输出:

Function sum took 0.123456 seconds to execute
  • 验证函数参数的装饰器:
def validate(func):
  def wrapper(*args, **kwargs):
    for arg in args:
      if not isinstance(arg, int):
        raise ValueError(f'Argument {arg} is not an integer')
    for key, value in kwargs.items():
      if not isinstance(value, int):
        raise ValueError(f'Argument {key} is not an integer')
    result = func(*args, **kwargs)
    return result
  return wrapper

@validate
def sum(a, b):
  return a + b

sum(1, 2)

调用sum(1, '2')将引发ValueError异常。

  • 为函数添加缓存功能的装饰器:
import functools

def cache(func):
  cache = {}
  @functools.wraps(func)
  def wrapper(*args, **kwargs):
    key = str(args) + str(kwargs)
    if key not in cache:
      cache[key] = func(*args, **kwargs)
    return cache[key]
  return wrapper

@cache
def fib(n):
  if n < 2:
    return n
  else:
    return fib(n-1) + fib(n-2)

fib(10)

调用fib(10)第二次时,它将从缓存中返回结果,而不会重新计算。

总结

装饰器是Python中一种至关重要的工具,它可以帮助我们为代码添加额外的功能,同时保持其优雅性和简洁性。通过利用装饰器,我们可以提高代码的可重用性和可维护性,从而编写出更健壮、更高效的应用程序。

常见问题解答

  1. 什么是装饰器?
    装饰器是用于增强类、方法和属性功能的Python函数。

  2. 装饰器如何工作?
    装饰器通过在函数执行前或后执行自定义逻辑来实现其功能。

  3. 装饰器有哪些优点?
    装饰器提高了代码的可重用性、可维护性、可读性和可扩展性。

  4. 有哪些常见的装饰器类型?
    常见的装饰器类型包括日志记录、性能测量、参数验证和缓存。

  5. 如何使用装饰器?
    在函数定义前添加@decorator语法来使用装饰器。