Python装饰器:给你的函数穿上“外套”

简介: Python装饰器:给你的函数穿上“外套”

Python装饰器:给你的函数穿上“外套”

你是否曾想过,如果能给Python函数“穿上外套”,在不改动它们的情况下增加新功能,该多好?比如,给多个函数添加日志记录或计时功能,而不用在每个函数里复制粘贴代码。装饰器(decorator)就是这样的神奇工具。

想象一下,函数是一颗灯泡,它的核心职责是发光。现在你想给它加上调光功能,直接换灯泡太麻烦。装饰器就像一个灯罩,套在灯泡上,就能调节亮度,而灯泡本身无需改变。在Python中,装饰器是一个高阶函数,它接收一个函数作为参数,并返回一个新的函数。这个新函数通常会在执行原函数前后添加额外代码,比如打印日志或测量时间。

举个例子,定义一个简单的装饰器,用于打印函数执行日志:

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

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

print(add(3, 5))  # 输出:调用函数 add,然后 8

这里,@log_decorator 语法将 add 函数传入 log_decorator,返回的 wrapper 函数替换了原来的 add。当我们调用 add 时,实际上执行的是 wrapper,它先打印日志,再调用原函数。

装饰器让代码更干净、可复用,是Python的优雅特性之一。学会它,你的代码将变得更加模块化和易维护。试试给你的函数也穿上一件“外套”吧!

相关文章
|
2月前
|
机器学习/深度学习 人工智能 自然语言处理
从零基础到双证在手:我的AI学习持证备考全记录
作为一名在传统行业打拼了三年的职场人,我深刻感受到人工智能浪潮带来的冲击——身边越来越多同事凭借AI技能提升工作效率,不少优质岗位的招聘要求里也明确标注“优先考虑AI相关认证持证人”。偶然间了解到CAIE注册人工智能工程师认证,其“零基础可学、国际认可、注重实战”的特点戳中了我的需求,于是下定决心开启备考之路。从一级入门到二级进阶,每一步都充满挑战却收获满满,如今回望,这份备考经历不仅让我拿到了权威认证,更让我真正掌握了AI应用技能,为职业发展打开了新赛道。
|
2月前
|
存储 人工智能 Cloud Native
云原生数据仓库 AnalyticDB Supabase 使用全攻略
云原生数据仓库 AnalyticDB PostgreSQL 版 Supabase 是基于开源 Supabase 深度增强的全托管平台,兼容 Supabase 生态,提供数据库、用户认证、边缘函数等核心能力,并集成通义千问等 AI 模型,支持 Vibe Coding 与智能应用快速开发。原生支持微信、支付宝 OAuth,具备企业级安全与全链路可观测性,助力开发者高效构建 AI 原生应用。
|
2月前
|
机器学习/深度学习 人工智能 算法
2025年高口碑数字人公司推荐,解锁互动新体验
2025年高口碑AI数字人榜单揭晓!集之互动以0.8秒实时响应、私有化部署和多场景闭环应用领先;Synthesia凭借超写实3D建模与多语言支持,助力全球化内容生产;D-ID创新隐私保护算法,守护敏感行业数据安全。三者分别在交互体验、内容效率与合规安全上表现卓越,满足企业多样化需求,推动数字人从“像真人”迈向“如员工”的实用新时代。
156 0
2025年高口碑数字人公司推荐,解锁互动新体验
|
2月前
|
人工智能 自然语言处理 搜索推荐
2025年热销榜单:头部AI数字人产品推荐
2025年AI数字人迎来爆发,集之互动、Synthesia、Soul Machines三款产品引领行业变革。从智能问答到多语言翻译,再到情感交互,它们在服务、教育、营销等场景展现强大潜力。本文深度解析其技术优势与适用领域,助你精准选型,把握人机交互新机遇。
158 0
|
前端开发 IDE 测试技术
自动化测试中的代码魔法:使用Python和Selenium框架
【8月更文挑战第31天】在软件开发的海洋中,自动化测试是一艘能够带领团队穿越波涛的帆船。本文将引导读者了解如何利用Python语言结合Selenium框架,编写简洁而强大的自动化测试脚本。我们将从搭建开发环境开始,逐步深入到实际案例,最后通过一个简单示例展示如何实现端到端的自动化测试流程。文章不仅提供实用的代码片段,还旨在激发读者对于软件测试深层次思考的热情。
|
Python
python中定义函数时使用位置参数
【7月更文挑战第25天】
309 7
|
运维 安全 Linux
Linux|编译最新版的openssh-server-9.3的rpm包(一)
Linux|编译最新版的openssh-server-9.3的rpm包(一)
905 0
|
Java
Java面向对象之构造方法
1.概念: 一个类中的一组方法 相同的方法名字 不同的参数列表 构成了方法重载 参数的不同体现在 参数的个数 参数的类型 参数的顺序 三个方面 2.作用: 为了便于记忆和调用 使得方法调用时更加的灵活 3.自己也可以设计方法重载 调用的时候 先通过方法名字来定位 名字一致 通过参数列表的数据类型来定位 方法返回值 修饰符--->跟方法重载没什么关系 4.JDK1.5之后 新的写法 动态参数列表 ... 参数类型固定 参数的个数可以动态 0-n 使用起来类似与数组的使用 length index int[]..
261 0
Java面向对象之构造方法
|
机器学习/深度学习 算法 安全
主动学习方法实践:让模型变“主动”
在机器学习的监督学习中,我们的目标是让模型不断学习带有标签的历史数据,从而提高模型在该领域的泛化能力。一般情况下,在上述的过程中,模型所学习的历史数据都是事先准备好的(数据采集,预处理,打标),有多少数据,模型就学习多少数据。换言之,模型在被动地学习我们事先提供的数据。本文分享一种主动学习方法,让模型参与“学习样本”的选择,根据不同策略,对样本池中的所有样本进行区分,提升模型性能。
966 0
主动学习方法实践:让模型变“主动”
|
算法 区块链 数据安全/隐私保护
比特币系统采用的公钥密码学方案和ECDSA签名算法介绍——第一部分:原理
ECC算法是基于有限域的椭圆曲线上的数学算法。关于ECC算法基本原理的介绍,请参考《ECC加密算法入门介绍》(http://www.8btc.com/eccmath),本文重点介绍Bitcoin系统中采用的公钥密码学方案和签名算法的实现细节。
2818 0