Python函数装饰器原理与用法详解
在Python中,函数装饰器是一种用于增强函数功能的语法结构。本文将深入探讨Python函数装饰器的原理和用法,让你能够充分理解并应用装饰器。
装饰器的基本概念
装饰器是一个callable对象,它接受函数对象作为参数,并返回一个新的函数对象(或修改原有的函数对象)。
当你使用装饰器语法将装饰器应用于某个函数时,实际上是将该函数作为参数传递给装饰器,然后将装饰器返回的新函数重新赋值给原函数的变量名。因此,该函数的功能得到了增强,但其函数名和参数签名保持不变。
装饰器的基本使用
下面是一个简单的装饰器示例,它将打印出函数执行的时间:
import time
def timer(func):
def wrapper(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
print(f'{func.__name__} run time: {end_time - start_time:.2f}s')
return result
return wrapper
@timer
def test():
time.sleep(2)
test()
注意到被装饰的函数 test()
前面有一个 @timer
标记,这是用来调用装饰器的语法。装饰器 timer
接收一个函数作为参数,返回一个新的函数对象 wrapper()
,在 wrapper()
中实现了打印函数执行时间的功能。
装饰器的参数
有时候装饰器需要调整参数。这可以通过在装饰器中再定义一个函数,接受所需参数,然后再定义一个装饰器函数来完成。下面是一个示例,它表示在执行函数前后打印两行消息:
def decorator_with_args(arg1, arg2):
def decorator(func):
def wrapper(*args, **kwargs):
print(f'arg1 is {arg1} and arg2 is {arg2}')
func(*args, **kwargs)
print('Done.')
return wrapper
return decorator
@decorator_with_args('hello', 123)
def test2():
print('Executing test2')
test2()
可以看到,装饰器 decorator_with_args
接受两个参数 arg1
和 arg2
,然后返回一个装饰器函数 decorator()
。这个装饰器函数接受一个函数作为参数 func
,然后返回一个新的函数对象 wrapper()
,在它的外层还包含一个函数 fn()
,并带有所需的参数 arg1
和 arg2
,以装饰被修饰函数。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python函数装饰器原理与用法详解 - Python技术站