了解Python中的装饰器函数及其运作方式
Python中的装饰器指的是一种可以修改函数或类行为的语法结构。这是一种非常重要的Python特性,因为它能够简化代码、提高可读性以及重复使用的程度。
装饰器实质上是一个函数,它接受一个函数为参数,并返回一个经过修改后的新函数。这个新函数可以调用原始的函数,并执行其自己的功能。
下面我们将介绍Python中装饰器函数的运作方式:
1.定义装饰器函数
装饰器函数通常以@符号开始。这个符号通常在函数定义之前,并在装饰器名称之后,表示将一个函数当做参数传递给装饰器函数:
@decorator_name
def some_function(x, y):
pass
其中decorator_name是装饰器函数的名称。
2.传递函数并定义装饰器函数
装饰器函数接受另一个函数名,然后定义并返回一个内部函数 - 这个内部函数将运行在原始函数之前或之后。
下面是一个简单的例子,它定义了一个简单的装饰器函数 add_two,它接受一个函数 f,返回一个新的函数 g,g将在 f 前添加一个额外的操作:
def add_two(f):
def g():
return f() + 2
return g
3.使用装饰器
要使用装饰器,请将它们添加到函数之前,按照以下格式添加:
@add_two
def some_function():
return 3
注意:在这里添加的 add_two 实际上是装饰器函数的名称。
当我们现在调用函数some_function(),经过装饰器之后返回的是3 + 2,即5。
4.使用 functools 库
Python提供了一个 functools 库,使得使用装饰器更加容易。functools提供了装饰器 @wraps,它在调用被包装函数时,可以帮助保留原始函数的签名和文档字符串。
下面的示例使用被称为“时间计时器”的装饰器,它将记录函数执行时间:
from functools import wraps
import time
def timer(func):
@wraps(func)
def wrapper(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
print(f"Elapsed time: {end_time - start_time}")
return result
return wrapper
@timer
def slow_function():
time.sleep(2)
return "done"
slow_function()
我们定义了装饰器 timer,并使用它来装饰slow_function函数。当我们调用slow_function函数时,它将打印“Elapsed time: 2.000000”,这是slow_function函数的实际执行时间。
总结
Python中的装饰器函数可以修改函数或类的行为。使用装饰器,可以简化代码、提高可读性以及重用程度。装饰器实质上是一个函数,它可以接受函数为参数,并返回一个修改后的函数。装饰器的使用通过使用@符号并紧随其后的装饰器名称来实现。Python提供了 functools 库来帮助简化装饰器。
