Python 装饰器基础

PythonPythonBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

介绍

Python 中的装饰器(Decorators)允许你修改或增强函数、类或方法的行为。它们是一种在不改变源代码的情况下动态改变代码功能的方式。在本实验中,我们将探索装饰器的基础知识,并学习如何使用它们为你的代码添加功能。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL python(("Python")) -.-> python/FunctionsGroup(["Functions"]) python(("Python")) -.-> python/AdvancedTopicsGroup(["Advanced Topics"]) python/FunctionsGroup -.-> python/function_definition("Function Definition") python/FunctionsGroup -.-> python/scope("Scope") python/AdvancedTopicsGroup -.-> python/decorators("Decorators") subgraph Lab Skills python/function_definition -.-> lab-76{{"Python 装饰器基础"}} python/scope -.-> lab-76{{"Python 装饰器基础"}} python/decorators -.-> lab-76{{"Python 装饰器基础"}} end

理解装饰器

让我们从一个简单的例子开始。打开一个新的 Python 解释器会话:

python3

我们有一个计算数字平方的函数:

def square(x):
    return x**2

现在假设我们想为 square 函数添加一个功能,每次调用时记录函数的输入和输出。我们可以使用装饰器来实现这一点。

以下是 logger 装饰器的代码:

def logger(func):
    def wrapper(x):
        print("Calling function:", func.__name__)
        print("Input:", x)
        result = func(x)
        print("Output:", result)
        return result
    return wrapper

现在我们可以使用这个装饰器来增强 square 函数:

@logger
def square(x):
    return x**2

当我们调用 square(5) 时,输出将是:

Calling function: square
Input: 5
Output: 25

如你所见,装饰器在不改变 square 函数源代码的情况下为其添加了所需的功能。

带参数的装饰器

装饰器也可以接受参数。例如,我们可以修改 logger 装饰器,使其在记录输入和输出之前打印一条自定义消息。

def logger(message):
    def decorator(func):
        def wrapper(x):
            print(message)
            print("Calling function:", func.__name__)
            print("Input:", x)
            result = func(x)
            print("Output:", result)
            return result
        return wrapper
    return decorator

现在我们可以使用这个更新后的装饰器来增强 square 函数:

@logger("This is a custom message")
def square(x):
    return x**2

当我们调用 square(5) 时,输出将是:

This is a custom message
Calling function: square
Input: 5
Output: 25

使用多个装饰器

你也可以将多个装饰器叠加在一起,以添加多层功能。例如,我们创建一个名为 timer 的新装饰器,用于测量函数运行所需的时间:

import time

def timer(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print("Time elapsed:", end_time - start_time)
        return result
    return wrapper

现在让我们在 square 函数上同时使用 loggertimer 装饰器:

@logger("This is a custom message")
@timer
def square(x):
    return x**2

当我们调用 square(5) 时,输出将是:

This is a custom message
Calling function: square
Input: 5
Output: 25
Time elapsed: 0.000001

如你所见,timer 装饰器为 square 函数添加了运行时间信息,而 logger 装饰器则添加了输入输出日志和自定义消息。

总结

在本实验中,我们学习了 Python 中装饰器的基础知识。我们了解了如何使用装饰器来修改函数、类或方法的行为,以及如何使用多个装饰器来添加多层功能。我们还学习了如何使用带参数的装饰器来添加自定义功能。

掌握了这些技能后,你现在可以开始将装饰器应用到代码中,从而让开发工作变得更加轻松!