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

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

admin4周前 (03-19)Python38

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

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

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 装饰器:从入门到实战的完整指南

装饰器(Decorator)是 Python中一种优雅的设计模式,它允许我们在不修改原函数代码的前提下,动态地添加功能。想象一下,你有一个已经写好的函数,现在需要为它添加日志记录、性能监控、权限验证等...

Python 装饰器进阶:从入门到实战,写出更灵活的函数增强技巧

# Python 装饰器进阶:从入门到实战,写出更灵活的函数增强技巧 ## 简介 很多 Python 开发者都听过装饰器,也知道怎么写简单的装饰器。但大多数人对装饰器的进阶用法,比如带参数的装饰器、...

Python 高级技巧:让你的代码更优雅高效

# Python 高级技巧:让你的代码更优雅高效 在 Python 编程的世界里,掌握基础语法只是第一步。真正的高手懂得运用高级技巧,让代码更简洁、更高效、更易维护。今天,我将分享一些实用且不那么广为...

Python 装饰器高级实战:从基础到精通的5个实用技巧

引言:为什么要深入掌握装饰器? 装饰器是 Python 中最优雅的元编程工具之一,它能在不修改原函数代码的情况下,动态地增加功能。很多开发者都知道如何使用 @timer 计时或 @cache 缓存,...

Python 异步编程实战:从零构建高性能 Web 爬虫

一、为什么需要异步编程? 在构建 Web 爬虫时,同步代码会面临一个严重的性能瓶颈。当我们用传统的 requests 库发送 HTTP 请求时,程序必须等待服务器响应后才能继续执行下一个请求。如果我...

Python装饰器:从基础到进阶的完整指南

装饰器(Decorator)是Python编程语言中一个非常强大的工具。简单来说,装饰器是一个可以接受函数作为参数,并返回一个新函数的函数。这种设计模式让我们能够在不修改原有函数代码的情况下,为函数...

发表评论

访客

看不清,换一张

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