Python装饰器简介
概述
装饰器是Python语言中比较重要的一个概念。它是一种用于修改函数或其它类的东西函数,通常我们使用@decorator的语法糖形式来调用它。
装饰器的使用场景
在不改变已有函数或类的前提下,又想对它们进行修改或扩展,就可以使用装饰器。比如,我们可以使用装饰器增加函数的输出信息,或者修改函数的行为。
装饰器通常用于日志记录、性能测试以及事务处理等领域的函数调用前后自动化处理。
装饰器的实现方法
在 Python 中,装饰器是通过函数来实现的,它可以有以下特性:
- 装饰器也是函数,可以把它理解成为一个包装器。
- 装饰器用于包装另外一个函数或者对象,即可以接受一个函数(对象)作为参数。
- 装饰器用于返回一个函数(对象)。
我们在使用装饰器时一般遵循以下的步骤:
- 定义一个装饰器函数
- 使用装饰器包装需要进行修饰的函数
- 使用被修饰的函数
装饰器的示例
下面我们通过两个例子来具体展示装饰器的使用方法:
示例一:增加函数执行信息
我们可以通过装饰器增加函数的执行信息,如函数的执行时间,函数的名称等等。
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函数负责检查传入的参数类型是否正确,如果不正确,则报错。