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

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

admin2个月前 (03-19)Python84

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

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

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 上下文管理器的实战应用与原理深度解析

Python 上下文管理器的实战应用与原理深度解析 概述 上下文管理器是 Python 中一个优雅而强大的特性,通过 with 语句实现资源的自动管理。本文将从原理到实践,深入讲解如何创建自定义上下...

Python装饰器实战:从入门到精通的5个实用技巧

Python装饰器(Decorator)是Python中最强大的特性之一,它允许我们在不修改原函数代码的情况下,为函数添加额外的功能。从Web框架的日志记录到API的权限验证,装饰器无处不在。本文将通...

Python dataclass:现代面向对象编程的最佳实践

在传统的 Python 面向对象编程中,当我们需要创建一个主要用于存储数据的类时,往往需要编写大量的样板代码。我们需要手动定义 `__init__` 方法来初始化属性,实现 `__repr__` 方...

Python 类型注解完整指南与最佳实践

引言 随着 Python 项目的规模增长,代码的可维护性和类型安全性变得越来越重要。Python 3.5 引入了类型注解(Type Hints)机制,允许开发者在代码中标注变量和函数的类型信息。虽然...

Python 装饰器的高级应用与最佳实践:从入门到精通

Python 装饰器(Decorator)是 Python 编程中最强大也最优雅的特性之一。它允许我们在不修改原函数代码的情况下,为函数添加额外功能。本文将深入探讨装饰器的高级应用场景和最佳实践,帮助...

发表评论

访客

看不清,换一张

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