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

Python装饰器函数应用和示例

发布时间:2023-06-25 17:39:26

Python装饰器函数是一种高级技术,它可以在不修改原始代码的情况下为现有函数添加新的行为。在Python中,函数是一等公民,这意味着它们可以作为参数传递给其他函数。

装饰器函数通常用于在函数调用前后执行一些额外的逻辑,例如计时、日志记录或授权检查。本文将介绍装饰器函数的应用和示例,以帮助您更好地理解这个概念。

1. 计时器装饰器

计时器装饰器是一个用于度量函数执行时间的简单示例。它会记录函数的开始和结束时间,并计算它们之间的差异。下面是一个例子:

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__} 耗时 {(end_time - start_time):.4f} 秒")
        return result
    return wrapper

@timer
def slow_function(n):
    time.sleep(n)
    return n

print(slow_function(2)) # 输出 "执行 slow_function 耗时 2.0000 秒
2"

在这个例子中,timer 装饰器接受一个函数 func 并返回一个新的函数 wrapper。新函数接受任意参数,因此可以用于装饰任何函数。

wrapper 函数中,我们记录函数的开始时间,执行函数,记录结束时间,计算差异,并输出执行时间的消息。最后,我们返回原始函数的结果。

我们使用 @timer 语法来应用装饰器。 这相当于将 slow_function 函数传递给 timer 装饰器并将其结果赋值给 slow_function。 由于 timer 返回的是 wrapper 函数,因此将 wrapper 的名称绑定到原始函数的名称上。

在执行 slow_function 时,该函数将被替换为 wrapper 函数。在执行完原始函数后,wrapper 将输出 执行 slow_function 耗时 x 秒 消息,并返回原始函数的结果。

2. 日志记录装饰器

日志记录是一个常见的应用程序特性,用于跟踪事件和调试错误。我们可以使用装饰器来添加基本的日志记录行为。下面是一个简单的示例:

def logged(func):
    def wrapper(*args, **kwargs):
        print(f"调用 {func.__name__}")
        result = func(*args, **kwargs)
        print(f"返回值: {result}")
        return result
    return wrapper

@logged
def add(x, y):
    return x + y

print(add(2, 3)) # 输出 "调用 add
返回值: 5
"

在这个例子中,logged 装饰器接受一个函数 func 并返回一个新的函数 wrapper。类似于上个例子,wrapper 函数接受任意参数并执行原始函数。

在新函数中,我们添加了两行日志记录语句:一行在函数调用之前,一行记录函数的结果和返回值。这些消息将输出到控制台,以便我们可以进行记录和调试。

我们再次使用 @logged 语法来应用装饰器。这将 add 函数传递给 logged 装饰器并将其结果绑定到 add 函数的名称上。

在执行 add 时,该函数将被替换为 wrapper 函数。wrapper 将输出两行日志记录消息,并返回原始函数的结果。

3. 授权检查装饰器

另一个有用的装饰器类型是授权检查装饰器。这种装饰器用于检查用户身份验证并限制对受保护资源的访问。下面是一个简单的例子:

def authenticated(func):
    def wrapper(*args, **kwargs):
        if is_authenticated():
            return func(*args, **kwargs)
        else:
            raise Exception("未经授权的访问")
    return wrapper

@authenticated
def secret_page():
    return "秘密页面内容"

def is_authenticated():
    return True

print(secret_page()) # 输出 "秘密页面内容"

在这个例子中,authenticated 装饰器接受一个函数 func,并返回一个新函数 wrapper。在新函数中,我们检查用户是否经过身份验证。如果验证通过,则执行原始函数并返回结果。如果未经过身份验证,则引发异常。

注意,这个装饰器通过全局函数 is_authenticated 来进行身份验证检查。在实际应用中,我们可能会使用一个更复杂的验证方案,例如 JWT 或 OAuth2。

我们使用 @authenticated 语法来应用装饰器。 这将 secret_page 函数传递给 authenticated 装饰器并将其结果绑定到 secret_page 函数的名称上。

在执行 secret_page 时,该函数将被替换为 wrapper 函数。在这个函数中,我们将执行身份验证检查并根据结果执行或拒绝对受保护资源的访问。

结论

装饰器函数是Python语言中的一个强大特性。它允许我们在不修改原始代码的情况下,添加新的行为和功能。在实践中,我们可以使用装饰器来度量性能、记录日志、实现授权、缓存结果等。

通过使用装饰器,我们可以让我们的代码更加简洁、可读、模块化和易于维护。无论是在编写大型Web应用程序还是小型脚本时,装饰器函数都是一个有用的工具。