Python装饰器:优雅的函数增强术

简介: Python装饰器:优雅的函数增强术

Python装饰器:优雅的函数增强术

在Python中,装饰器(Decorator)是一种强大的语法特性,它允许我们在不修改原函数代码的情况下,为其添加新功能。这种“元编程”能力使代码更加模块化和可复用。

装饰器基础

装饰器本质上是一个函数,它接受一个函数作为参数,并返回一个新函数。最常见的用途包括日志记录、性能测试、权限校验等。

def simple_decorator(func):
    def wrapper():
        print("函数执行前")
        func()
        print("函数执行后")
    return wrapper

@simple_decorator
def say_hello():
    print("Hello, World!")

say_hello()

带参数的装饰器

实际开发中,我们常常需要装饰器能够接受参数:

import time

def timer_decorator(repeat=1):
    def decorator(func):
        def wrapper(*args, **kwargs):
            total_time = 0
            for _ in range(repeat):
                start = time.time()
                result = func(*args, **kwargs)
                total_time += time.time() - start
            print(f"平均执行时间: {total_time/repeat:.4f}秒")
            return result
        return wrapper
    return decorator

@timer_decorator(repeat=3)
def heavy_computation():
    return sum(i**2 for i in range(10000))

类装饰器

除了函数装饰器,Python还支持类装饰器,通过实现__call__方法来实现:

class CountCalls:
    def __init__(self, func):
        self.func = func
        self.call_count = 0

    def __call__(self, *args, **kwargs):
        self.call_count += 1
        print(f"函数已被调用{self.call_count}次")
        return self.func(*args, **kwargs)

@CountCalls
def process_data():
    # 数据处理逻辑
    pass

最佳实践

  1. 使用functools.wraps保留原函数的元数据
  2. 保持装饰器的单一职责
  3. 考虑装饰器的执行顺序(从内到外)

装饰器是Python优雅设计哲学的完美体现,合理使用能让代码更加简洁、可维护。掌握这一特性,你将在Python开发中游刃有余。

相关文章
|
2月前
|
API 数据安全/隐私保护 计算机视觉
用Python批量处理图片,5分钟搞定一天的工作
用Python批量处理图片,5分钟搞定一天的工作
349 128
|
2月前
|
安全 Unix API
告别混乱时间处理:Python中time与datetime模块的实用选择
告别混乱时间处理:Python中time与datetime模块的实用选择
346 126
|
2月前
|
存储 JSON API
Python轻松玩转JSON文件:读写实战指南
Python轻松玩转JSON文件:读写实战指南
254 22
|
2月前
|
数据采集 数据库 Python
Python异步编程入门:告别“等待”,让代码飞起来
Python异步编程入门:告别“等待”,让代码飞起来
294 100
|
2月前
|
IDE 开发工具 开发者
Python 类型提示:不只是装饰,更是承诺
Python 类型提示:不只是装饰,更是承诺
274 127
|
2月前
|
人工智能 前端开发 API
Google发布50页AI Agent白皮书,老金帮你提炼10个核心要点
老金分享Google最新AI Agent指南:让AI从“动嘴”到“动手”。Agent=大脑(模型)+手(工具)+协调系统,可自主完成任务。通过ReAct模式、多Agent协作与RAG等技术,实现真正自动化。入门推荐LangChain,文末附开源知识库链接。
2087 119
|
3月前
|
人工智能 运维 自然语言处理
别让 LLM 变成“甩锅发动机”——从安全、审计、隐私聊聊运维智能助手怎么落地
别让 LLM 变成“甩锅发动机”——从安全、审计、隐私聊聊运维智能助手怎么落地
432 117
|
3月前
|
缓存 前端开发 测试技术
GLM-4.7开源!交出“生产级代码”
智谱今日发布并开源GLM-4.7,专注Coding场景,显著提升编程、推理与工具协同能力,在多项基准测试中位居开源模型前列。已上线z.ai与智谱清言,支持API调用。
2085 3
|
3月前
|
前端开发 小程序 JavaScript
A2UI 规范与 AG-UI 协议:打造高效协同的界面开发体系
A2UI规范与AG-UI协议构建“设计-开发”协同闭环:前者统一视觉与交互标准,后者定义组件通信与跨平台适配,二者融合提升协作效率、保障体验一致,推动界面开发向标准化、可复用、高效能演进。
2170 0