Python装饰器:如何为函数添加额外的功能?
Python中的装饰器是一种使函数添加额外功能的方法,它是以函数为输入并返回函数作为输出的函数。装饰器通常用于在不修改原始函数代码的情况下添加其他功能。它可以在保留函数原始功能的同时轻松地添加新功能,例如计时,验证等。
装饰器可以通过 @ 符号将它们附加到特定函数上。例如:
@decorator
def my_function():
# function code
装饰器的基本结构如下:
def my_decorator(func):
def wrapper():
# wrapper code
return func()
return wrapper
@my_decorator
def my_function():
# function code
在这个例子中,my_decorator是一个装饰器函数,它接受一个函数对象作为输入,并返回另一个函数包装器。此包装器函数执行附加功能并最终调用原始函数。因此,使用 my_decorator 装饰 my_function,就是在调用 my_function 前后添加额外的功能。
接下来,我们来看一些不同类型的装饰器:
1. 记录访问时间的装饰器
import time
def time_it(func):
def wrapper(*args, **kwargs):
start = time.time()
result = func(*args, **kwargs)
end = time.time()
print(f'{func.__name__} took {round(end - start, 2)} seconds to execute')
return result
return wrapper
@time_it
def my_function():
time.sleep(2)
return 'Done!'
print(my_function())
在上面的例子中,装饰器函数 time_it 接受一个函数作为输入。它包装原始函数,使用 time.time() 记录函数开始和结束时间,并计算函数执行时间。最后,它打印函数执行时间并返回原始函数的结果。
2. 缓存结果的装饰器
def memoize(func):
cache = {}
def wrapper(*args):
if args not in cache:
cache[args] = func(*args)
return cache[args]
return wrapper
@memoize
def fibonacci(n):
if n <= 1:
return n
return fibonacci(n-1) + fibonacci(n-2)
print(fibonacci(6))
在上面的例子中,装饰器函数 memoize 接受一个函数作为输入,并定义一个空的字典 cache 来缓存函数结果。wrapper 函数接受任意数目的参数,并使用它们来查找或计算函数结果。如果结果已经存在于缓存中,则返回它。否则,它将计算函数结果并将其添加到缓存中。
3. 检查用户身份认证的装饰器
def authenticate(func):
def wrapper(username, password, *args, **kwargs):
if username == 'admin' and password == '1234':
return func(*args, **kwargs)
else:
return 'Access denied'
return wrapper
@authenticate
def restricted_function():
return 'Access granted'
print(restricted_function('admin', '1234'))
在这个例子中,authenticate装饰器接受一个函数作为输入,并定义一个新的包装器函数wrapper。wrapper函数接受特定的参数,并检查用户是否具有适当的身份验证凭据。如果凭据有效,wrapper函数将调用原始函数;否则,它将返回“访问被拒绝”。
结论
装饰器是一种非常强大的工具,可通过轻松扩展和修改现有函数来增强代码的可重用性和灵活性。通过使用装饰器,可以在不更改现有代码实现的同时添加新的功能。通过结合装饰器和参数,可以避免代码重复,并加快开发速度和可维护性。
