Python装饰器:优雅地增强函数功能

简介: Python装饰器:优雅地增强函数功能

Python装饰器:优雅地增强函数功能

在Python开发中,我们常常需要在已有函数上增加日志、计时、权限校验等额外功能。如果直接修改函数代码,不仅破坏开闭原则,还会导致重复代码。装饰器(Decorator)正是解决这一问题的利器——它让你在不改动函数源码的前提下,为函数“穿上”新的能力。

装饰器本质:函数也是对象

装饰器本质上是一个可调用对象(通常是函数),它接收一个函数作为参数,并返回一个新的函数。来看一个最简单的例子:

def logger(func):
    def wrapper(*args, **kwargs):
        print(f"调用函数:{func.__name__}")
        return func(*args, **kwargs)
    return wrapper

def add(x, y):
    return x + y

# 手动装饰
add = logger(add)

Python提供的@语法糖让这个过程更加直观:

@logger
def add(x, y):
    return x + y

实战:计时装饰器

假设我们需要测量多个函数的执行时间,写一个计时装饰器可以一劳永逸:

import time
from functools import wraps

def timer(func):
    @wraps(func)  # 保留原函数的元信息
    def wrapper(*args, **kwargs):
        start = time.perf_counter()
        result = func(*args, **kwargs)
        end = time.perf_counter()
        print(f"{func.__name__} 耗时:{end - start:.4f}秒")
        return result
    return wrapper

@timer
def slow_task():
    time.sleep(1)
    return "完成"

slow_task()  # 输出:slow_task 耗时:1.0002秒

这里使用了functools.wraps,它能将原函数的__name____doc__等属性复制到包装函数上,避免调试时混淆。

带参数的装饰器

有时我们希望装饰器本身接收参数,只需再嵌套一层:

def repeat(times):
    def decorator(func):
        def wrapper(*args, **kwargs):
            for _ in range(times):
                func(*args, **kwargs)
        return wrapper
    return decorator

@repeat(times=3)
def greet():
    print("你好!")

greet()  # 打印三次“你好!”

总结

装饰器是Python“语法糖”中的典范,它基于闭包高阶函数,实现了关注点分离。无论是框架开发(Flask路由、Django权限)还是日常工具库,装饰器都能让代码更简洁、更Pythonic。掌握它,你的编程风格将迈上新台阶。

目录
相关文章
|
1天前
|
安全 数据库连接 数据库
掌握Python上下文管理器:优雅资源管理的艺术
掌握Python上下文管理器:优雅资源管理的艺术
191 155
|
1天前
|
存储 Python 容器
简化Python类:使用数据类(dataclasses)
简化Python类:使用数据类(dataclasses)
50 18
|
30天前
|
人工智能 安全 调度
AI工程vs传统工程 —「道法术」中的变与不变
本文从“道、法、术”三个层面对比AI工程与传统软件工程的异同,指出AI工程并非推倒重来,而是在传统工程坚实基础上,为应对大模型带来的不确定性(如概率性输出、幻觉、高延迟等)所进行的架构升级:在“道”上,从追求绝对正确转向管理概率预期;在“法”上,延续分层解耦、高可用等原则,但建模重心转向上下文工程与不确定性边界控制;在“术”上,融合传统工程基本功与AI新工具(如Context Engineering、轨迹可视化、多维评估体系),最终以确定性架构驾驭不确定性智能,实现可靠价值交付。
358 41
AI工程vs传统工程 —「道法术」中的变与不变
|
30天前
|
数据采集 人工智能 IDE
告别碎片化日志:一套方案采集所有主流 AI 编程工具
本文介绍了一套基于MCP架构的轻量化、多AI工具代码采集方案,支持CLI、IDE等多类工具,实现用户无感、可扩展的数据采集,已对接Aone日志平台,助力AI代码采纳率分析与研发效能提升。
421 46
告别碎片化日志:一套方案采集所有主流 AI 编程工具
|
1月前
|
SQL 人工智能 分布式计算
从工单、文档到结构化知识库:一套可复用的 Agent 知识采集方案
我们构建了一套“自动提取 → 智能泛化 → 增量更新 → 向量化同步”的全链路自动化 pipeline,将 Agent 知识库建设中的收集、提质与维护难题转化为简单易用的 Python 工具,让知识高效、持续、低门槛地赋能智能体。
361 36
|
1天前
|
缓存 人工智能 自然语言处理
企业级编程助手避坑指南:数月躬身摸索,凝炼实操进阶巧思
在软件开发向团队化、工程化进阶的当下,企业级编程助手已不再是单纯的AI编码辅助载体,而是成为覆盖需求→设计→开发→Review全流程的研发基础设施。它依托多模型适配引擎与规范驱动开发体系,融合静态代码分析、环境隔离等核心技术,能实现自然语言任务驱动、自动化代码评审、多端协同开发等功能,帮助研发团队减少重复劳动、提升工程质量。本文结合几个月来的实际使用经历,分享编程助手的实操技巧、实际应用案例及使用心得,旨在为同行提供可落地的实践经验,规避使用误区。
|
1天前
|
安全 物联网 C++
技术抉择:微调还是 RAG?——以春节祝福生成为例
本文以春节祝福生成为例,剖析微调与RAG的本质差异:RAG解决“信息缺失”,微调重塑“表达偏好”。当任务重风格、重分寸、重一致性(如拜年话术),模型缺的不是知识,而是默认的得体表达——此时微调比RAG更直接、可控、高效。
254 152
|
15天前
|
人工智能 关系型数据库 Serverless
2 天,用函数计算 AgentRun 爆改一副赛博朋克眼镜
2 天将吃灰的 Meta 眼镜改造成“交警Copilot”:通过阿里云函数计算 AgentRun 实现端-管-云协同,利用 Prompt 驱动交通规则判断,结合 OCR 与数据库查询,打造可动态扩展的智能执法原型,展现 Agent 架构在真实场景中的灵活与高效。
299 44
|
1月前
|
人工智能 弹性计算 运维
探秘 AgentRun丨为什么应该把 LangChain 等框架部署到函数计算 AgentRun
阿里云函数计算 AgentRun,专为 AI Agent 打造的一站式 Serverless 基础设施。无缝集成 LangChain、AgentScope 等主流框架,零代码改造即可享受弹性伸缩、企业级沙箱、模型高可用与全链路可观测能力,助力 Agent 高效、安全、低成本地落地生产。
340 48
|
16天前
|
XML 前端开发 Serverless
自建一个 Agent 很难吗?一语道破,万语难明
本文分享了在奥德赛TQL研发平台中集成BFF Agent的完整实践:基于LangGraph构建状态图,采用Iframe嵌入、Faas托管与Next.js+React框架;通过XML提示词优化、结构化知识库(RAG+DeepWiki)、工具链白名单及上下文压缩(保留近3轮对话)等策略,显著提升TQL脚本生成质量与稳定性。
315 33
自建一个 Agent 很难吗?一语道破,万语难明