当前位置:首页 > Python > 正文内容

Python 装饰器完全指南:从入门到实战

admin4个月前 (03-19)Python137

装饰器本质上是一个接受函数作为参数并返回新函数的高阶函数。理解这一点是掌握装饰器的关键。想象一下,你有一个函数,你想在它执行前后添加一些额外的逻辑,比如日志记录、性能测试、权限验证等。装饰器就是为这种场景而生的。

让我们从一个最简单的例子开始。假设你有一个函数,你想知道它执行了多长时间:

import time
from functools import wraps

def timer_decorator(func):
    """计算函数执行时间的装饰器"""
    @wraps(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_decorator
def slow_function():
    time.sleep(1)
    return "完成"

slow_function()

这个例子展示了装饰器的基本结构。@wraps 是一个重要的细节,它保留了原函数的元数据(如函数名、文档字符串等),否则调试时会看到 wrapper 而不是原函数名。

接下来,让我们看看带参数的装饰器。这种装饰器更加灵活,可以接受配置参数:

def retry(max_attempts=3, delay=1):
    """失败后自动重试的装饰器"""
    def decorator(func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            attempts = 0
            while attempts < max_attempts:
                try:
                    return func(*args, **kwargs)
                except Exception as e:
                    attempts += 1
                    if attempts >= max_attempts:
                        raise
                    print(f"重试 {attempts}/{max_attempts}, 等待 {delay}秒...")
                    time.sleep(delay)
        return wrapper
    return decorator

@retry(max_attempts=5, delay=0.5)
def unstable_operation():
    import random
    if random.random() < 0.7:
        raise ConnectionError("网络不稳定")
    return "操作成功"

带参数的装饰器需要三层嵌套:最外层接收装饰器参数,中间层接收被装饰的函数,最内层是实际执行的 wrapper。这种模式在实际开发中非常常见。

装饰器不仅可以用于函数,还可以用于类方法。这在 Web 开发中特别有用,比如实现权限检查。我们可以堆叠多个装饰器,装饰器的执行顺序是从下往上的。

类装饰器是另一个强大的工具,它允许你修改整个类的行为,比如实现单例模式。在实际项目中,装饰器有着广泛的应用,包括缓存装饰器避免重复计算、日志装饰器记录函数调用、速率限制装饰器防止 API 被滥用等。

编写装饰器时有一些最佳实践需要注意:始终使用 @wraps 来保留原函数的元数据;让装饰器接受 *args 和 **kwargs;保持装饰器的单一职责;考虑装饰器的性能影响。

装饰器是 Python 优雅性的体现之一。它让你能够以声明式的方式添加功能,使代码更加简洁和可维护。掌握装饰器后,你会发现很多原本需要重复编写的代码可以用几行装饰器来解决。

相关文章

Python 装饰器的高级应用与实战技巧

装饰器本质上是接受函数作为参数并返回新函数的高阶函数。理解这一点是掌握装饰器的关键。让我们从基础开始,逐步深入到高级应用。首先,我们需要理解函数在 Python 中是一等公民。这意味着函数可以像其他对...

Python 装饰器完全指南:从原理到实战的 5 个核心场景

装饰器(Decorator)是 Python 中最具魅力的特性之一。它允许我们在不修改原函数代码的前提下,动态地添加功能。但很多开发者对装饰器的理解仅停留在在函数上面加个@符号的层面。今天,我们将从底...

Python 生成器进阶:理解 yield 与构建高效迭代器

在 Python 开发中,我们经常需要处理大量数据或流式数据,如果一次性将所有数据加载到内存中,不仅会占用大量内存空间,还可能导致程序运行缓慢甚至崩溃。生成器(Generator)正是解决这个问题的利...

Python装饰器实战指南:从入门到精通

Python 装饰器是许多开发者既熟悉又陌生的功能。熟悉是因为我们在框架中经常看到 @符号,陌生是因为很多人只是知其然不知其所以然。本文将从零开始,通过实际案例深入讲解装饰器的工作原理和应用场景。...

Python字典的高级技巧与实战应用

在日常Python开发中,字典(dict)是我们最亲密的数据结构伙伴。无论是配置管理、数据缓存还是API响应处理,字典都在默默地发挥作用。但很多开发者只停留在基础用法,其实Python字典还有许多高级...

Python 装饰器:从原理到实战应用,打造优雅代码

在 Python 编程中,装饰器(Decorator)是一个经常被提及但又容易让初学者困惑的概念。简单来说,装饰器是一种设计模式,它允许我们在不修改原始函数代码的情况下,为函数添加额外的功能。这种"包...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。