装饰器是Python中一种特殊的语法结构,它允许程序员在不修改被装饰对象源代码的情况下,通过在函数或类定义前加上“@装饰器函数”的形式来动态地扩展或修改原始行为,使得代码复用和可维护性更好。
装饰器本质是一个闭包函数,所以在讲解装饰器之前,需要先理解Python闭包函数的概念,闭包函数有以下几个特点:
- 闭包函数是函数的嵌套,函数内还有函数,即外层函数嵌套一个内层函数。
- 在外层函数定义局部变量,在内层函数通过nonlocal引用,并实现指定功能。
装饰器-记录函数运行时间:
import time
def time_func(func):
def wrapper(*args, **kwargs):
start = time.time()
result = func(*args, **kwargs)
end = time.time()
print(func.__name__ + "\n" + f"{end - start:0.4f}")
return result
return wrapper
@time_func
def fib(n):
if n <= 1:
return n
else:
return fib(n-1) + fib(n-2)
print(fib(30))
在这个例子中,我们定义了一个计时器装饰器函数time_func,它接收一个函数作为参数,并返回一个新的函数wrapper。wrapper函数包含了原始函数fib的所有参数(使用args和*kwargs),并在执行原始函数之前记录起始时间,在执行结束后打印运行时间。
使用装饰器语法糖@time_func修饰fib函数,可以自动将fib传递给time_func函数,将fib函数修改为wrapper函数,并返回修改后的wrapper函数。最后我们调用fib(30)来测试程序的运行时间。