探索Python中的装饰器:提升代码复用性的利器

简介: 本文深入探讨了Python中强大的装饰器功能,揭示了其如何通过元编程和闭包等技术手段,优雅地实现代码的复用与扩展。从基本概念到高级应用,我们将一步步揭开装饰器背后的奥秘,并通过实例展示其在实际项目开发中的巨大价值。无论是想要简化函数调用流程、增强函数功能,还是实现AOP(面向切面编程),掌握装饰器都是每位Python开发者必备的技能。

在 Python 编程中,装饰器是一种设计模式,它允许我们以声明的方式修改或增强一个函数或方法的行为,而无需永久性地修改其源代码。装饰器本质上是一个接受函数作为参数并返回一个新函数的高阶函数。它们广泛应用于日志记录、缓存、权限验证等多个领域,是提升代码可读性和复用性的重要工具。

一、装饰器的基本用法

最简单的装饰器形式是将一个函数作为参数传递给另一个函数,这被称为高阶函数。例如,我们有一个函数add, 我们希望在其执行前后打印一些信息,就可以创建一个装饰器函数log_decorator来实现这个功能。

def log_decorator(func):
    def wrapper(*args, **kwargs):
        print("Before calling function")
        result = func(*args, **kwargs)
        print("After calling function")
        return result
    return wrapper

@log_decorator
def add(a, b):
    return a + b

# 输出:
# Before calling function
# After calling function
# 3

在上面的例子中,log_decorator 是一个装饰器,它接收一个函数 func 作为参数,并定义了一个内部函数 wrapper,该函数在调用前后打印信息。使用 @log_decorator 语法糖来装饰 add 函数,当我们调用 add(1, 2) 时,实际上是调用了 wrapper(1, 2)

二、更复杂的应用场景

1. 带参数的装饰器

有时,我们可能需要给装饰器传递参数。可以通过嵌套函数的方式来实现这一点。

def repeat(n):
    def actual_decorator(func):
        def wrapper(*args, **kwargs):
            for _ in range(n):
                result = func(*args, **kwargs)
            return result
        return wrapper
    return actual_decorator

@repeat(3)
def say_hello(name):
    print(f"Hello, {name}!")

# 输出:
# Hello, Alice!
# Hello, Alice!
# Hello, Alice!

在这个例子中,我们定义了一个名为 repeat 的装饰器工厂,它接受一个参数 n,并返回实际的装饰器 actual_decorator。这样我们就可以根据需要重复执行被装饰的函数多次。

2. 类装饰器

除了函数装饰器外,Python还支持类装饰器。类装饰器可以更好地处理需要维护状态的情况。

class Repeat:
    def __init__(self, n):
        self.n = n

    def __call__(self, func):
        def wrapper(*args, **kwargs):
            for _ in range(self.n):
                result = func(*args, **kwargs)
            return result
        return wrapper

@Repeat(3)
def say_goodbye(name):
    print(f"Goodbye, {name}!")

# 输出:
# Goodbye, Bob!
# Goodbye, Bob!
# Goodbye, Bob!

这里,Repeat 类定义了一个 __call__ 方法,使得其实例可以像函数一样被调用。这样我们就可以像使用函数装饰器一样使用类装饰器。

三、结合实际问题的应用

假设我们正在开发一个 Web 应用,需要对某些视图函数进行权限验证。我们可以编写一个名为 require_authentication 的装饰器来实现这一功能。

def require_authentication(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        if not current_user.is_authenticated():
            raise PermissionDenied()
        return func(*args, **kwargs)
    return wrapper

@require_authentication
def edit_profile():
    # Edit profile code here
    pass

在这个例子中,require_authentication 装饰器用于确保用户已登录才允许访问 edit_profile 函数。如果当前用户未通过身份验证,则会引发 PermissionDenied 异常。

总之,Python 中的装饰器提供了一种灵活而强大的方式来扩展和重用心。无论是简单的日志记录还是复杂的权限验证逻辑,都可以借助装饰器来实现。通过合理利用装饰器,我们可以大大提高代码的可维护性和复用性。

相关文章
|
3月前
|
运维 监控 算法
时间序列异常检测:MSET-SPRT组合方法的原理和Python代码实现
MSET-SPRT是一种结合多元状态估计技术(MSET)与序贯概率比检验(SPRT)的混合框架,专为高维度、强关联数据流的异常检测设计。MSET通过历史数据建模估计系统预期状态,SPRT基于统计推断判定偏差显著性,二者协同实现精准高效的异常识别。本文以Python为例,展示其在模拟数据中的应用,证明其在工业监控、设备健康管理及网络安全等领域的可靠性与有效性。
663 13
时间序列异常检测:MSET-SPRT组合方法的原理和Python代码实现
|
3月前
|
SQL 自然语言处理 数据库
【Azure Developer】分享两段Python代码处理表格(CSV格式)数据 : 根据每列的内容生成SQL语句
本文介绍了使用Python Pandas处理数据收集任务中格式不统一的问题。针对两种情况:服务名对应多人拥有状态(1/0表示),以及服务名与人名重复列的情况,分别采用双层for循环和字典数据结构实现数据转换,最终生成Name对应的Services列表(逗号分隔)。此方法高效解决大量数据的人工处理难题,减少错误并提升效率。文中附带代码示例及执行结果截图,便于理解和实践。
104 5
|
18天前
|
机器学习/深度学习 算法 PyTorch
从零开始200行python代码实现LLM
本文从零开始用Python实现了一个极简但完整的大语言模型,帮助读者理解LLM的工作原理。首先通过传统方法构建了一个诗词生成器,利用字符间的概率关系递归生成文本。接着引入PyTorch框架,逐步重构代码,实现了一个真正的Bigram模型。文中详细解释了词汇表(tokenizer)、张量(Tensor)、反向传播、梯度下降等关键概念,并展示了如何用Embedding层和线性层搭建模型。最终实现了babyGPT_v1.py,一个能生成类似诗词的简单语言模型。下一篇文章将在此基础上实现自注意力机制和完整的GPT模型。
从零开始200行python代码实现LLM
|
18天前
|
机器学习/深度学习 人工智能 PyTorch
200行python代码实现从Bigram模型到LLM
本文从零基础出发,逐步实现了一个类似GPT的Transformer模型。首先通过Bigram模型生成诗词,接着加入Positional Encoding实现位置信息编码,再引入Single Head Self-Attention机制计算token间的关系,并扩展到Multi-Head Self-Attention以增强表现力。随后添加FeedForward、Block结构、残差连接(Residual Connection)、投影(Projection)、层归一化(Layer Normalization)及Dropout等组件,最终调整超参数完成一个6层、6头、384维度的“0.0155B”模型
200行python代码实现从Bigram模型到LLM
|
1月前
|
数据采集 运维 API
把Postman调试脚本秒变Python采集代码的三大技巧
本文介绍了如何借助 Postman 调试工具快速生成 Python 爬虫代码,并结合爬虫代理实现高效数据采集。文章通过“跨界混搭”结构,先讲解 Postman 的 API 调试功能,再映射到 Python 爬虫技术,重点分享三大技巧:利用 Postman 生成请求骨架、通过 Session 管理 Cookie 和 User-Agent,以及集成代理 IP 提升稳定性。以票务信息采集为例,展示完整实现流程,探讨其在抗封锁、团队协作等方面的价值,帮助开发者快速构建生产级爬虫代码。
把Postman调试脚本秒变Python采集代码的三大技巧
|
28天前
|
人工智能 API Python
掌握 Python 文件处理、并行处理和装饰器
本文介绍了 Python 在文件处理、并行处理以及高级功能(如装饰器、Lambda 函数和推导式)的应用。第一部分讲解了文件的基本操作、读写方法及处理大型文件的技巧,并演示了使用 Pandas 处理结构化数据的方式。第二部分探讨了多线程与多进程的并行处理,以及 `concurrent.futures` 模块的简化用法,适合不同类型的任务需求。第三部分则深入装饰器的实现与应用,包括简单装饰器、带参数的装饰器及 `functools.wraps` 的使用,同时简要介绍了 Lambda 函数和推导式的语法与场景。内容实用且全面,帮助读者掌握 Python 高效编程的核心技能。
|
27天前
|
机器学习/深度学习 算法 测试技术
图神经网络在信息检索重排序中的应用:原理、架构与Python代码解析
本文探讨了基于图的重排序方法在信息检索领域的应用与前景。传统两阶段检索架构中,初始检索速度快但结果可能含噪声,重排序阶段通过强大语言模型提升精度,但仍面临复杂需求挑战
69 0
图神经网络在信息检索重排序中的应用:原理、架构与Python代码解析
|
29天前
|
存储 机器学习/深度学习 人工智能
多模态RAG实战指南:完整Python代码实现AI同时理解图片、表格和文本
本文探讨了多模态RAG系统的最优实现方案,通过模态特定处理与后期融合技术,在性能、准确性和复杂度间达成平衡。系统包含文档分割、内容提取、HTML转换、语义分块及向量化存储五大模块,有效保留结构和关系信息。相比传统方法,该方案显著提升了复杂查询的检索精度(+23%),并支持灵活升级。文章还介绍了查询处理机制与优势对比,为构建高效多模态RAG系统提供了实践指导。
267 0
多模态RAG实战指南:完整Python代码实现AI同时理解图片、表格和文本
|
5月前
|
测试技术 数据库 Python
Python装饰器实战:打造高效性能计时工具
在数据分析中,处理大规模数据时,分析代码性能至关重要。本文介绍如何使用Python装饰器实现性能计时工具,在不改变现有代码的基础上,方便快速地测试函数执行时间。该方法具有侵入性小、复用性强、灵活度高等优点,有助于快速发现性能瓶颈并优化代码。通过设置循环次数参数,可以更准确地评估函数的平均执行时间,提升开发效率。
175 61
Python装饰器实战:打造高效性能计时工具
|
2月前
|
开发框架 Java .NET
Python中main函数:代码结构的基石
在Python中,`main`函数是程序结构化和模块化的重要组成部分。它实现了脚本执行与模块导入的分离,避免全局作用域污染并提升代码复用性。其核心作用包括:标准化程序入口、保障模块复用及支持测试驱动开发(TDD)。根据项目复杂度,`main`函数有基础版、函数封装版、参数解析版和类封装版四种典型写法。 与其他语言相比,Python的`main`机制更灵活,支持同一文件作为脚本运行或模块导入。进阶技巧涵盖多文件项目管理、命令行参数处理、环境变量配置及日志集成等。此外,还需注意常见错误如全局变量污染和循环导入,并通过延迟加载、多进程支持和类型提示优化性能。
219 0

推荐镜像

更多