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