python10(闭包  装饰器)
引言好的我们今天继续学习闭包 装饰器在 Python 语言的高级特性中闭包与装饰器是函数式编程范式的两项核心机制。二者在底层逻辑上具有内在一致性闭包提供了函数对其定义时所在作用域中变量的持久访问能力而装饰器则基于闭包机制实现对现有函数行为的无侵入式增强。掌握闭包是理解装饰器的基础二者构成递进关系。一、闭包函数的持久化状态载体闭包的本质可定义为一个内部函数连同其引用的外部函数作用域中的变量共同构成的可调用对象。外部函数执行完毕后其局部变量并不会被立即回收而是通过内部函数的__closure__属性得以保留供后续调用使用。1. 闭包形成的三个必要条件存在函数嵌套定义外部函数内部定义内部函数内部函数引用了外部函数作用域中的变量包括参数外部函数将内部函数作为返回值返回。defouter(a):b5definner():c7print(abc)# 引用了外部变量 a 和 breturninner inner_funcouter(3)# inner_func 为闭包实例inner_func()# 输出 152. 闭包的状态保持机制普通函数执行完毕后其局部变量即被销毁但闭包将所引用的外部变量存储于__closure__元组中每个cell对象保存一个变量的值。print(inner_func.__closure__)# 返回 cell 对象元组print(inner_func.__closure__[0].cell_contents)# 输出 3变量 aprint(inner_func.__closure__[1].cell_contents)# 输出 5变量 b注所有自定义函数均具有__closure__属性非闭包函数该属性为None。该属性主要用于调试与内省一般开发中不直接操作。3. 闭包中的延迟绑定陷阱以下代码输出结果与直觉可能不符defouter():funcs[]forkinrange(3):definner():returnk*k funcs.append(inner)returnfuncs f1,f2,f3outer()print(f1())# 输出 4而非 0print(f2())# 输出 4print(f3())# 输出 4原因分析三个内部函数共享同一变量k循环结束后k的值为 2因此三个函数均返回 4。解决方案利用默认参数在定义时绑定当前值。defouter():funcs[]forkinrange(3):definner(kk):# 默认参数固化 k 的当前值returnk*k funcs.append(inner)returnfuncs# 此时 f1()0, f2()1, f3()4二、装饰器函数行为的修饰与增强装饰器是一种可调用对象函数或类其输入为一个函数输出为一个新的函数。装饰器在不修改原函数源代码的前提下为其附加额外逻辑如日志、计时、权限校验等体现了面向切面编程AOP的思想。使用装饰器的优势提升代码的模块化与可维护性实现关注点分离增强代码复用性同一装饰器可应用于多个目标函数语法简洁提高可读性。1. 无参数的函数装饰器基础实现形式如下importtimedeftimer(func):defwrapper(sleep_time):t1time.time()func(sleep_time)t2time.time()print(fExecution time:{t2-t1}seconds)returnwrappertimer# 等价于 function timer(function)deffunction(sleep_time):time.sleep(sleep_time)function(3)# 实际执行 wrapper(3)执行流程timer语法糖在定义时即执行将function作为参数传入timer返回wrapper并将名称function重新绑定至wrapper。因此调用function(3)时实际执行的是wrapper(3)。2. 带参数的函数装饰器若装饰器本身需接收参数则需构造三层嵌套函数importtimedefinteraction(name):# 第一层接收装饰器参数defwrapper(func):# 第二层接收被装饰函数defdeco(work_time):# 第三层接收原函数参数print(f{name}请将待洗衣物放入。)func(work_time)print(f{name}洗涤完成请取回。)returndecoreturnwrapperinteraction(张三)# 先执行 interaction(张三) 返回 wrapper再 wrapperdefwasher(work_time):time.sleep(work_time)print(设备运行中...)washer(3)执行顺序interaction(张三)先调用interaction(张三)获得wrapper再执行wrapper即washer wrapper(washer)最终washer指向deco。3. 无参数的类装饰器利用类实现装饰器时需在__init__中接收被装饰函数在__call__中定义调用逻辑。importtimeclassTimer:def__init__(self,func):self.funcfuncdef__call__(self,sleep_time):t1time.time()self.func(sleep_time)t2time.time()print(fExecution time:{t2-t1}seconds)Timer# 等价于 function Timer(function)deffunction(sleep_time):time.sleep(sleep_time)function(3)# 调用 Timer 实例的 __call__ 方法4. 带参数的类装饰器带参数时__init__接收装饰器参数__call__接收被装饰函数并返回内部包装函数。importtimeclassInteraction:def__init__(self,name):# 接收装饰器参数self.namenamedef__call__(self,func):# 接收被装饰函数defdeco(work_time):print(f{self.name}请将待洗衣物放入。)func(work_time)print(f{self.name}洗涤完成请取回。)returndecoInteraction(张三)# 实例化 Interaction(张三)再调用 __call__(washer)defwasher(work_time):time.sleep(work_time)print(设备运行中...)washer(3)三、多个装饰器的叠加顺序一个函数可同时应用多个装饰器其执行顺序遵循自下而上的规则即离被装饰函数最近的装饰器先执行。importtimedefdeco(func):defwrapper1(*args):resfunc(*args)returnresreturnwrapper1deftimer(func):defwrapper2(*args):start_timetime.time()resfunc(*args)end_timetime.time()print(fFunction execution time:{end_time-start_time})returnresreturnwrapper2decotimerdefadd(*args):time.sleep(2)returnsum(args)print(add(3,4,5))# 先由 timer 包装再由 deco 包装执行顺序解析定义add后首先执行add timer(add)得到wrapper2然后执行add deco(wrapper2)得到wrapper1。调用时先进入wrapper1其内部调用wrapper2最后才执行原始add函数。四、内置装饰器标准库提供的常见装饰器Python 内置了三个用于类方法的装饰器分别服务于不同场景装饰器功能描述典型用途classmethod定义类方法第一个参数为类对象cls可通过类或实例调用操作类属性或工厂方法staticmethod定义静态方法无需self或cls参数逻辑上属于类但独立于实例工具函数与类相关但不依赖实例状态property将方法转换为只读属性调用时无需括号封装属性访问实现计算属性或权限控制property示例classStudent:def__init__(self,name,age):self.namename self.ageagepropertydefadult_age_p(self):return18defadult_age(self):return18propertydefadult_flag(self):returnself.ageself.adult_age_p stuStudent(张三,18)print(stu.adult_age())# 常规方法调用 → 18print(stu.adult_age_p)# 属性访问 → 18print(stu.adult_flag)# Truestu.age17print(stu.adult_flag)# False# stu.adult_age_p 19 # 赋值操作将抛出 AttributeError因为该属性只读P.S.property可与方法名.setter配合使用实现可写属性本文不作展开。结语闭包与装饰器是 Python 中实现高阶函数与代码增强的重要工具。闭包的核心价值在于维持函数的状态上下文而装饰器则在此基础上提供了灵活的行为注入能力。理解二者的底层实现机制——尤其是函数嵌套、变量绑定与函数对象传递——是掌握 Python 函数式编程的关键一步。建议通过编写计时、日志、权限校验等常见装饰器加深对执行流程与控制权的理解。那么我们今天就到这儿了感谢各位阅读。如有疑问欢迎进一步探讨。下图为本文知识点的思维导图示意

相关新闻

3步突破:免费文档下载革命,一站式获取30+平台资源

3步突破:免费文档下载革命,一站式获取30+平台资源

3步突破:免费文档下载革命,一站式获取30平台资源 【免费下载链接】kill-doc 看到经常有小伙伴们需要下载一些免费文档,但是相关网站浏览体验不好各种广告,各种登录验证,需要很多步骤才能下载文档,该脚本就是…

2026/7/30 10:42:20 阅读更多 →
《刚刚问世》系列初窥篇-Java+Playwright自动化测试-- 操作Select下拉选择框 - 下篇(详细教程)

《刚刚问世》系列初窥篇-Java+Playwright自动化测试-- 操作Select下拉选择框 - 下篇(详细教程)

《刚刚问世》系列初窥篇-JavaPlaywright自动化测试-- 操作Select下拉选择框 - 下篇(详细教程) 前言在上一篇文章中,我们学习了如何用Playwright在Java中定位和选择下拉选择框的基础操作,比如通过索引、value值和可见文本选择选项。…

2026/7/30 10:42:20 阅读更多 →
数字内容创作的未来:AI 工作流的崛起

数字内容创作的未来:AI 工作流的崛起

短视频、漫剧、数字动画、剧情解说等数字内容需求持续爆发,传统作坊式生产模式产能、成本、标准化短板凸显,集成化 AI 全链路工作流成为数字内容产业的核心变革方向,定义未来十年内容生产新标准。 AI 工作流区别于单一功能 AI 工具&#xff0…

2026/7/30 10:42:20 阅读更多 →

最新新闻

GetQzonehistory技术深度解析:构建QQ空间历史数据归档系统的5大核心架构设计

GetQzonehistory技术深度解析:构建QQ空间历史数据归档系统的5大核心架构设计

GetQzonehistory技术深度解析:构建QQ空间历史数据归档系统的5大核心架构设计 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 在社交媒体数据日益重要的今天,如何…

2026/7/30 10:51:23 阅读更多 →
2026年蜜蜂数标OPC生态:一人加六十个智能体的未来工作方式

2026年蜜蜂数标OPC生态:一人加六十个智能体的未来工作方式

摘要:当"一人AI"的OPC创业模式在全国兴起,蜜蜂数标以生态共建者身份参与西安首个人工智能OPC创新社区,为创业者提供智能体开发、知识库搭建、数据集服务和项目孵化四类支持。人机协作比例1:60、目标1:100——蜜蜂数标正在用实践证明…

2026/7/30 10:51:23 阅读更多 →
除湿机选购指南:核心参数解析与美的50L/D大容量实测

除湿机选购指南:核心参数解析与美的50L/D大容量实测

最近南方又到了梅雨季节,家里墙壁渗水、衣物晾不干的问题让很多朋友头疼不已。作为过来人,我深知一台合适的除湿机对生活品质的提升有多重要。今天就来详细聊聊除湿机的选购要点,并以美的 CF50BD/N7-DP5 这款50L/D大容量除湿器为例&#xff0…

2026/7/30 10:51:23 阅读更多 →
GetQzonehistory:QQ空间历史数据恢复技术方案完整指南

GetQzonehistory:QQ空间历史数据恢复技术方案完整指南

GetQzonehistory:QQ空间历史数据恢复技术方案完整指南 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory GetQzonehistory是一款专为QQ空间历史数据恢复设计的Python技术方案&a…

2026/7/30 10:51:23 阅读更多 →
字符串数字运算全解析:正则提取、精度控制与多语言实现

字符串数字运算全解析:正则提取、精度控制与多语言实现

在日常开发中,我们经常会遇到需要从字符串中提取数字并进行运算的场景。比如处理用户输入的"购买3件商品,单价25.5元",或者解析日志中的"耗时2.3秒,内存占用512MB"。这类需求看似简单,但实际处理时…

2026/7/30 10:51:23 阅读更多 →
从零构建Open3D C++ GUI应用:环境配置、CMake与3D可视化实战

从零构建Open3D C++ GUI应用:环境配置、CMake与3D可视化实战

1. 项目概述:从零构建Open3D C GUI应用如果你已经用Python玩过Open3D,体验过它简洁的API和快速的3D可视化,那么当你转向C时,可能会感到一丝“落差”。Python里几行代码就能弹出的窗口,在C里需要你亲手搭建一个完整的应…

2026/7/30 10:50:22 阅读更多 →

日新闻

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南 【免费下载链接】DriverStoreExplorer Driver Store Explorer 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer 您是否曾因Windows系统盘空间不足而烦恼?是否遇到过设…

2026/7/30 0:00:13 阅读更多 →
如何3步掌握Video Download Helper:网页视频下载的完整实战指南

如何3步掌握Video Download Helper:网页视频下载的完整实战指南

如何3步掌握Video Download Helper:网页视频下载的完整实战指南 【免费下载链接】VideoDownloadHelper Chrome Extension to Help Download Video for Some Video Sites. 项目地址: https://gitcode.com/gh_mirrors/vi/VideoDownloadHelper 你是否曾经在浏览…

2026/7/30 0:00:13 阅读更多 →
“双减”后首个AI备课压力测试报告:覆盖32所中小学的176节AI辅助课,暴露4大隐性增负节点

“双减”后首个AI备课压力测试报告:覆盖32所中小学的176节AI辅助课,暴露4大隐性增负节点

更多请点击: https://intelliparadigm.com 第一章:AI 教师备课辅助 AI 教师备课辅助系统正逐步成为教育数字化转型的核心支撑工具,它并非替代教师,而是通过语义理解、知识图谱与多模态生成能力,将教师从重复性劳动中解…

2026/7/30 0:00:13 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/29 22:18:20 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/29 14:34:28 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/29 15:00:03 阅读更多 →

月新闻