news 2026/9/9 3:20:37

Python 装饰器函数(decoratots) 学习笔记

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python 装饰器函数(decoratots) 学习笔记

是什么

装饰器 = 一个函数,它接收另一个函数作为参数,并返回一个新的函数(通常通过闭包实现)
本质是高阶函数 + 闭包,用于在不修改原函数代码的前提下,增强函数功能

Python 装饰器(decorator)是一种以函数 / 类作为参数、并返回新函数 / 类的高阶工具(springAop),
它可以在不修改被装饰对象源码和调用方式的前提下,为其添加额外功能(如日志、计时、权限校验等)。
补充一句通俗理解:
装饰器就像给函数 / 类 “穿一件外套”,外套自带额外功能,不改变衣服本身,却能让衣服拥有新的特性。

Spring的前置后置通知

装饰器的语法使用 @decorator_name 来应用在函数或方法上。

Python 还提供了一些内置的装饰器,比如 @staticmethod 和 @classmethod,用于定义静态方法和类方法。

能干嘛

日志记录: 装饰器可用于记录函数的调用信息、参数和返回值。

性能分析: 可以使用装饰器来测量函数的执行时间。

权限控制: 装饰器可用于限制对某些函数的访问权限。

缓存: 装饰器可用于实现函数结果的缓存,以提高性能。

函数装饰器完整工作流程

绑定(传入原函数)→ 定义包装(封装额外功能)→ 替换(返回包装函数)→ 调用(执行包装逻辑 + 原函数逻辑)

案例代码

""" 装饰器(decorators)是 Python 中的一种高级功能,它允许你动态地修改函数或类的行为。 装饰器是一种函数,它接受一个函数作为参数并返回一个新的函数或修改原来的函数。 本质上是一个接收函数作为输入并返回一个新的包装过后的函数的对象。 """# 1 基础使用# my_decorator 是一个装饰器函数,它接受say_hello函数作为参数并返回 wrapper 函数。defmy_decorator(original_function):defwrapper():print("在原函数之前执行")original_function()print("在原函数之后执行")returnwrapper# my_decorator注解将 say_hello 替换为 wrapper@my_decoratordefsay_hello():print("Hello!")say_hello()print("*"*10)# 2 带参数的装饰器defmy_decorator_v2(original_function):defwrapper(*args,**kwargs):print("在原函数之前执行")original_function(*args,**kwargs)print("在原函数之后执行")returnwrapper@my_decorator_v2defsay_bye(name):print(f"Hello,{name}!")say_bye("李四")importtime# 步骤1:定义装饰器函数(接收被装饰的函数作为参数)deftimer_decorator(original_function):# 步骤2:定义嵌套的包装函数(封装额外功能,调用原函数)defwrapper():# 额外功能:记录开始时间start_time=time.time()print("在原函数之前执行")# 调用被装饰的原函数,保留其核心功能result=original_function()print("在原函数之后执行")# 额外功能:计算并打印耗时end_time=time.time()print(f"函数{original_function.__name__}执行耗时:{end_time-start_time:.6f}秒")# 返回原函数的执行结果,保证被装饰函数的返回值不丢失returnresult# 步骤3:返回包装函数(而非直接执行,保留包装逻辑供后续调用)returnwrapper# 步骤4:定义被装饰的目标函数(核心业务逻辑)defmy_business_func():time.sleep(0.5)# 模拟耗时操作print("核心业务逻辑执行完成")return"执行成功"# 步骤5:手动应用装饰器my_business_funcVar=timer_decorator(my_business_func)print(my_business_funcVar)# 调用装饰后的函数result=my_business_funcVar()print("函数返回值:",result)deftimer_decorator(original_function):# 包装函数添加 *args 和 **kwargs,兼容任意参数defwrapper(*args,**kwargs):start_time=time.time()# 调用原函数时传入参数,保证核心逻辑正常执行result=original_function(*args,**kwargs)end_time=time.time()print(f"函数{original_function.__name__}执行耗时:{end_time-start_time:.6f}秒")returnresultreturnwrapper@timer_decoratordefmy_business_func(name,age=20):time.sleep(0.5)print(f"核心业务逻辑:姓名{name},年龄{age}")returnf"{name}业务执行成功"# 带参数调用,装饰器正常工作result=my_business_func("张三",age=25)print("函数返回值:",result)

多层装饰器

deflog(func):@wraps(func)defwrapper(*args,**kwargs):print(f"Log:{func.__name__}")returnfunc(*args,**kwargs)returnwrapperdeftimer(func):@wraps(func)defwrapper(*args,**kwargs):start=time.time()result=func(*args,**kwargs)print(f"Timer:{time.time()-start:.4f}s")returnresultreturnwrapper@log@timerdefadd(a,b):returna+b add(3,4)# 先执行 log,再执行 timer

💡执行顺序
装饰器从下往上应用(@log先于@timer被写,但实际执行时timer先包裹add,然后log包裹timer的返回值)

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/8 20:46:31

手把手教你用WinDbg对比x64与ARM64蓝屏堆栈回溯

以下是对您提供的技术博文进行 深度润色与结构重构后的专业级技术文章 。整体风格更贴近一位资深Windows内核调试专家在技术社区(如OSR Online、NTDebugging Blog或知乎专栏)中自然分享的口吻—— 去AI痕迹、强逻辑流、重实战感、有温度、有洞见 ,同时严格遵循您提出的全…

作者头像 李华
网站建设 2026/9/4 3:29:11

Java发明者介绍

JAVA的发明者詹姆斯高斯林(James Gosling)是JAVA编程语言的主要发明者,被誉为“JAVA之父”。他于1955年5月19日出生于加拿大阿尔伯塔省,拥有卡内基梅隆大学的计算机科学博士学位。主要贡献高斯林在1991年领导了Sun Microsystems的…

作者头像 李华
网站建设 2026/9/4 2:06:36

Expo中使用地图组件:实战示例

以下是对您提供的博文《Expo中使用地图组件:实战技术分析》的 深度润色与专业重构版本 。本次优化严格遵循您的全部要求: ✅ 彻底去除AI痕迹,语言自然、老练、有“人味”——像一位在一线带团队做LBS产品的资深前端架构师在分享经验&#…

作者头像 李华
网站建设 2026/9/2 22:39:33

Live Avatar故障排查手册:NCCL初始化失败与端口冲突解决方法

Live Avatar故障排查手册:NCCL初始化失败与端口冲突解决方法 1. Live Avatar模型简介 Live Avatar是由阿里联合高校开源的数字人生成模型,专注于高质量、低延迟的实时数字人视频合成。它融合了扩散模型(DiT)、文本编码器&#x…

作者头像 李华
网站建设 2026/9/8 15:43:58

Arduino IDE下载加速技巧:提升教学效率的实用方法

以下是对您提供的博文内容进行 深度润色与结构重构后的技术教学类文章 。整体风格更贴近一位资深嵌入式教学实践者的真实分享:语言自然、逻辑递进、去模板化、重实操细节,并强化了“教师视角”的教学适配性与一线落地经验。全文已去除所有AI痕迹&#…

作者头像 李华
网站建设 2026/9/3 4:26:10

fft npainting lama键盘导航支持:无障碍访问改进措施

FFT NPainting LaMa 键盘导航支持:无障碍访问改进措施 1. 为什么需要键盘导航支持 图像修复工具不只是设计师的专属,更是内容创作者、视障用户、行动不便者和所有追求高效工作流的人需要的生产力助手。但传统WebUI大多依赖鼠标操作——画笔拖拽、按钮点…

作者头像 李华