欢迎访问宙启技术站
智能推送

Python装饰器:如何为函数添加额外的功能?

发布时间:2023-05-31 03:02:00

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函数将调用原始函数;否则,它将返回“访问被拒绝”。

结论

装饰器是一种非常强大的工具,可通过轻松扩展和修改现有函数来增强代码的可重用性和灵活性。通过使用装饰器,可以在不更改现有代码实现的同时添加新的功能。通过结合装饰器和参数,可以避免代码重复,并加快开发速度和可维护性。