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

Python 装饰器完全指南:从原理到实战应用

admin2周前 (03-24)Python25

什么是装饰器?

装饰器(Decorator)是 Python 中一个非常强大的功能,它允许你在不修改原函数代码的情况下,为函数添加额外的功能。装饰器本质上是一个接受函数作为参数,并返回一个新函数的高阶函数。

装饰器的应用场景非常广泛:日志记录、性能计时、权限验证、缓存、重试机制等都可以通过装饰器优雅地实现。

函数装饰器的基础

让我们从一个最简单的例子开始。假设我们想在执行函数前后打印一些信息:

def simple_decorator(func):\n    def wrapper():\n        print("执行函数前...")\n        func()\n        print("执行函数后...")\n    return wrapper\n\n@simple_decorator\ndef say_hello():\n    print("Hello, World!")\n\n# 调用函数\nsay_hello()\n

输出结果:

执行函数前...\nHello, World!\n执行函数后...\n

这里的关键是:@simple_decorator 语法糖实际上是 say_hello = simple_decorator(say_hello) 的简写形式。

处理带参数的函数

上面的简单装饰器只能处理无参数的函数。如果原函数有参数,我们需要用 *args 和 **kwargs 来传递任意参数:

def log_decorator(func):\n    def wrapper(*args, **kwargs):\n        print(f"调用函数: {func.__name__}")\n        print(f"参数: args={args}, kwargs={kwargs}")\n        result = func(*args, **kwargs)\n        print(f"返回值: {result}")\n        return result\n    return wrapper\n\n@log_decorator\ndef add_numbers(a, b, multiplier=1):\n    return (a   b) * multiplier\n\nresult = add_numbers(3, 5, multiplier=2)\n

输出结果:

调用函数: add_numbers\n参数: args=(3, 5), kwargs={multiplier: 2}\n返回值: 16\n

带参数的装饰器

有时候我们需要装饰器本身接受参数。这需要再嵌套一层函数:

def repeat_decorator(times):\n    def decorator(func):\n        def wrapper(*args, **kwargs):\n            results = []\n            for _ in range(times):\n                result = func(*args, **kwargs)\n                results.append(result)\n            return results\n        return wrapper\n    return decorator\n\n@repeat_decorator(times=3)\ndef greet(name):\n    return f"Hello, {name}!"\nugs = greet("Alice")\nprint(results)\n

输出结果:

[Hello,                                            

相关文章

Python 上下文管理器的实战应用与原理深度解析

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

Python异步编程入门与实战

异步编程是一种并发执行的编程模式,它允许程序在等待耗时操作(如网络请求、文件读写)时,继续执行其他任务。Python 3.5引入了async/await语法,使得异步编程变得更加直观和易于理解。为什么...

Python 上下文管理器:让代码更优雅

在 Python 开发中,我们经常需要处理资源的获取和释放——这些资源可能是文件句柄、数据库连接、网络%E 套接或锁。传统的方法是使用 try-finally 块来确保资源被正确释放,但这种方式往往使...

Python 多线程基础与 ThreadPoolExecutor 实战

在 Python 中,多线程是实现并发的一种常见方式,尤其在处理 I/O 密集型任务时效果明显。本文从线程的基本概念入手,演示如何使用 threading.Thread 模块创建线程,并对比使用 Th...

Python dataclass 完全指南:从入门到高级应用

在 Python 开发中,我们经常需要创建用于存储数据的类。传统的做法是编写大量的样板代码:__init__ 方法、__repr__ 方法、__eq__ 方法等。这不仅繁琐,还容易出错。Python...

Python 装饰器进阶:带参数装饰器与类装饰器实战

装饰器(Decorator)是 Python 中最优雅的特性之一,它允许我们在不修改原函数代码的情况下,为函数添加额外功能。上一篇我们学习了基础装饰器,今天将深入探讨两个进阶主题:带参数的装饰器和类装...

发表评论

访客

看不清,换一张

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