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 函数式编程的关键一步。建议通过编写计时、日志、权限校验等常见装饰器加深对执行流程与控制权的理解。那么我们今天就到这儿了感谢各位阅读。如有疑问欢迎进一步探讨。下图为本文知识点的思维导图示意

相关新闻

企业级三方聊天软件工具|IM即时通讯定制开发与私有化部署方案

企业级三方聊天软件工具|IM即时通讯定制开发与私有化部署方案

🚀企业级三方聊天软件工具|IM即时通讯定制开发与私有化部署方案 随着企业数字化沟通需求不断提升,安全、高效、稳定的即时通讯系统成为团队协作的重要基础。我们专注于 IM聊天软件工具定制开发与私有化部署,为企业提供专属通讯解决…

2026/7/30 10:43:45阅读更多 →
Create React App:零配置React开发的工程实践

Create React App:零配置React开发的工程实践

1. 从手动配置到零配置的革命2016年,当create-react-app首次出现在React社区时,它彻底改变了前端开发的入门体验。作为一个长期与webpack配置搏斗的React开发者,我至今记得第一次使用CRA时的震撼——不需要再纠结babel插件版本冲突&#xff0…

2026/7/30 10:43:45阅读更多 →
推荐一款IOS端的mqtt测试工具

推荐一款IOS端的mqtt测试工具

苹果应用市场搜索:MQTT工具 MQTT for iOS:一款基于 SwiftUI 的轻量级 MQTT 客户端关键词:iOS、SwiftUI、MQTT、物联网、SwiftData、Network.framework、StoreKit 2、Keychain一款面向开发者、物联网调试和家庭自动化场景的原生 iOS MQTT 客…

2026/7/30 10:43:45阅读更多 →
数据仓库实战:从核心概念到分层建模与问题排查

数据仓库实战:从核心概念到分层建模与问题排查

1. 项目概述:从“数据堆”到“数据大脑”的蜕变 干了这么多年数据,我经常被问到:“你们天天说的数据仓库,到底是个啥玩意儿?” 尤其是在业务部门眼里,它可能就是个存数据的“大硬盘”,或者一个写…

2026/7/30 14:23:02阅读更多 →
MATLAB 2025a 报错:MathWorks Licensing Error 8(错误代码 -8.2)

MATLAB 2025a 报错:MathWorks Licensing Error 8(错误代码 -8.2)

第一次尝试&#xff1a; 1.复制解压后文件包&#xff1a;Crack\win64\matlab_startup_plugins\lmgrimpl中的libmwlmgrimpl.dll文件 2.右键matlab桌面图标<打开文件所在位置<找到bin\win64\matlab_startup_plugins\lmgrimpl文件夹&#xff0c;粘贴并替换目标文件libmwlm…

2026/7/30 14:23:02阅读更多 →
Bedrock Launcher:Windows平台Minecraft基岩版终极启动器完全指南

Bedrock Launcher:Windows平台Minecraft基岩版终极启动器完全指南

Bedrock Launcher&#xff1a;Windows平台Minecraft基岩版终极启动器完全指南 【免费下载链接】BedrockLauncher 项目地址: https://gitcode.com/gh_mirrors/be/BedrockLauncher Minecraft基岩版玩家们&#xff0c;是否厌倦了官方启动器的功能限制&#xff1f;Bedrock …

2026/7/30 14:23:02阅读更多 →
Warm-Flow工作流引擎入门:比Flowable轻量在哪

Warm-Flow工作流引擎入门:比Flowable轻量在哪

背景 去年用一个人AI给公司搭内部管理平台的时候&#xff0c;技术选型卡在工作流引擎上。请假、报销、招待费这些审批流程是刚需&#xff0c;绕不开。 一开始看的是Flowable&#xff0c;毕竟是Activiti原班人马做的&#xff0c;社区活跃、功能齐全。但研究了几天后我放弃了—…

2026/7/30 14:23:02阅读更多 →
Obsidian Local REST API:如何为你的知识库构建自动化编程接口

Obsidian Local REST API:如何为你的知识库构建自动化编程接口

Obsidian Local REST API&#xff1a;如何为你的知识库构建自动化编程接口 【免费下载链接】obsidian-local-rest-api A secure REST API and Model Context Protocol (MCP) server for your vault. 项目地址: https://gitcode.com/gh_mirrors/ob/obsidian-local-rest-api …

2026/7/30 14:23:02阅读更多 →
PNG格式深度解析:从原理到实战优化与WebP对比

PNG格式深度解析:从原理到实战优化与WebP对比

1. 从一次“图片变胖”的线上事故说起 去年&#xff0c;我们团队负责的一个面向C端用户的H5活动页上线后&#xff0c;突然收到大量用户反馈&#xff0c;说页面加载速度极慢&#xff0c;尤其是在移动网络下&#xff0c;几乎无法正常浏览。我们紧急排查&#xff0c;发现罪魁祸首是…

2026/7/30 14:21:02阅读更多 →
覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

&#x1f539; 工具基础介绍 OpenClaw 是开源生态中一款实用性较强的本地智能工具&#xff0c;凭借本地离线运行、可视化图形操作和任务自动化三大核心特性&#xff0c;赢得了众多用户的青睐。与普通在线对话AI工具不同&#xff0c;它属于能够直接操控本机软硬件的智能数字员工…

2026/7/29 9:47:45阅读更多 →
伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

所谓液压伺服阀体的精密激光焊接&#xff0c;是用激光束对阀座壳体&#xff08;通常为不锈钢或铝合金&#xff09;进行密封焊接&#xff0c;使阀体在21-35MPa的高压液压油或压缩气体中长期运行而不发生介质泄漏。液压伺服阀是高端液压系统的"大脑"。从航空航天飞行控…

2026/7/30 12:22:27阅读更多 →
D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX&#xff1a;三步实现《暗黑破坏神2》高清宽屏体验的终极指南 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 你是否还在…

2026/7/29 7:58:51阅读更多 →
3分钟解锁iOS应用自由:TrollInstallerX让你的iPhone摆脱安装限制 [特殊字符]

3分钟解锁iOS应用自由:TrollInstallerX让你的iPhone摆脱安装限制 [特殊字符]

3分钟解锁iOS应用自由&#xff1a;TrollInstallerX让你的iPhone摆脱安装限制 &#x1f680; 【免费下载链接】TrollInstallerX A TrollStore installer for iOS 14.0 - 16.6.1 项目地址: https://gitcode.com/gh_mirrors/tr/TrollInstallerX 你是否曾经因为iOS系统的严格…

2026/7/30 0:00:58阅读更多 →
[GESP202606 四级] 扫雷

[GESP202606 四级] 扫雷

B4557 [GESP202606 四级] 扫雷 https://www.luogu.com.cn/problem/B4557 中国计算机学会&#xff08;CCF&#xff09;2026年6月C四级讲解——扫雷 https://www.bilibili.com/video/BV1MCMg6AEXR/ B4557 [GESP202606 四级] 扫雷 https://www.bilibili.com/video/BV1ZKTj6ZEVh/ 2…

2026/7/30 0:00:58阅读更多 →
Windows驱动存储终极清理工具:DriverStoreExplorer完全指南

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

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

2026/7/30 0:00:58阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时&#xff0c;发现推理速度只有可怜的 1-2 FPS&#xff0c;而别人的演示视频却能跑到 30 FPS 以上&#xff0c;那么问题很可能不在模型本身&#xff0c;而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后&#xff0c;会直接使用官方示例…

2026/7/30 0:27:26阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一&#xff1a;为什么你需要了解 Coze 和 Dify&#xff1f;如果你对 AI 应用开发感兴趣&#xff0c;但一看到“大模型”、“智能体”、“工作流”这些词就头疼&#xff0c;觉得门槛太高&#xff0c;那这篇文章就是为你准备的。很多开发者&#xff0c;包括我自己&#…

2026/7/30 4:47:18阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会&#xff1a;配图一直是个让人头疼的问题。2026年&#xff0c;AI生图工具已经非常成熟了&#xff0c;但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1&#xff1a;速度之王2026年6月11日&#xff0c…

2026/7/29 14:26:42阅读更多 →