python 装饰器的基本使用

1. 基本概念

装饰器是 Python 语言中的一种函数式编程的技术,它可以在不修改目标函数的源代码及调用方式情况下,动态的增强目标函数的功能。在 Python 中,装饰器本质上是一个可以接受一个函数作为参数,并返回一个新函数作为结果的函数。

1.1 装饰器作用

装饰器可以给已有函数增加一些额外的功能,例如:

计时、日志记录等通用的功能。

缓存、权限检查等角色特定的功能。

1.2 装饰器分类

装饰器通常分为两类:函数装饰器和类装饰器。

函数装饰器:接受一个函数作为参数,并返回经过修饰后的函数。

类装饰器:接受一个类作为参数,并返回一个经过修饰后的类。

2. 装饰器实现

下面是一个使用函数装饰器实现日志记录的例子。

import logging

logging.basicConfig(level=logging.INFO)

def log_decorator(func):

def wrapper(*args, **kwargs):

logging.info(f'Calling function {func.__name__} with args: {args}, kwargs:{kwargs}.')

return func(*args, **kwargs)

return wrapper

@log_decorator

def add(a, b):

return a + b

result = add(1, 2)

logging.info(f'Result of adding 1 and 2 is {result}')

在上述代码中,首先定义了一个可以接受一个函数作为参数的装饰器函数 log_decorator。该装饰器函数中定义了一个名为 wrapper 的函数,用于接受原函数的参数,并实现日志记录的功能。

接着,在 add 函数前使用 @log_decorator 装饰器语法来对 add 函数进行装饰,使得调用 add 函数时,会先调用装饰器函数中的 wrapper 函数实现日志记录。最后,输出添加结果到日志。

3. 装饰器的应用

3.1 记录函数执行时间

下面是一个使用装饰器记录函数执行时间的例子。

import time

def time_it_decorator(func):

def wrapper(*args, **kwargs):

start = time.time()

result = func(*args, **kwargs)

end = time.time()

print(f'{func.__name__} executed in {end - start} seconds.')

return result

return wrapper

@time_it_decorator

def fibonacci(n):

if n <= 1:

return n

return fibonacci(n - 1) + fibonacci(n - 2)

result = fibonacci(30)

print(result)

在上述代码中,定义了一个可以记录函数执行时间的装饰器函数 time_it_decorator。该装饰器做了如下工作:

记录开始时间。

执行目标函数。

记录结束时间,计算时间差,输出函数执行时间。

3.2 缓存

下面是一个使用装饰器实现缓存功能的例子。

def cache_decorator(func):

cache = {}

def wrapper(n):

if n not in cache:

cache[n] = func(n)

return cache[n]

return wrapper

@cache_decorator

def fibonacci(n):

if n <= 1:

return n

return fibonacci(n - 1) + fibonacci(n - 2)

result = fibonacci(30)

print(result)

在上述代码中,定义了一个可以实现缓存功能的装饰器函数 cache_decorator。该装饰器做了如下工作:

定义一个缓存功能。

判断目标函数的参数是否在缓存中,如果在,则直接返回缓存中的结果;如果不在,则调用目标函数。

将目标函数的结果存入缓存中,并返回结果。

4. 注意事项

使用装饰器需要注意如下事项:

装饰器只能在被装饰函数定义之前定义,否则会出现语法错误。

一个函数可以同时被多个装饰器修饰,这种情况下,多个装饰器的调用顺序是由下向上的。

5. 结论

Python 装饰器是 Python 语言中的一种函数式编程的技术,它可以在不修改目标函数的源代码及调用方式情况下,动态的增强目标函数的功能。使用装饰器可以方便地给函数添加一些通用的或角色特定的功能,例如计时、日志记录、缓存、权限检查等。在使用装饰器时需要注意语法及多个装饰器的调用顺序等问题。

后端开发标签