Python高阶精讲:闭包与装饰器彻底吃透(零基础看懂+实战源码)
Python高阶精讲闭包与装饰器彻底吃透零基础看懂实战源码前言很多Python开发者学了很久依然看不懂装饰器、不会手写装饰器、不懂闭包原理。但闭包和装饰器是Python进阶分水岭源码、框架Flask/Django、缓存、日志、接口鉴权、性能统计底层全部依赖这套语法。本文用最通俗的语言分步拆解完整实战源码从零带你吃透函数进阶 → 闭包原理 → 装饰器基础 → 有参装饰器 → 多层装饰器 → 企业级实战场景零基础也能一次性学懂。目录01 前置基础Python函数的核心特性一切的前提02 闭包详解定义、条件、核心作用、避坑点03 装饰器本质基于闭包的语法糖04 零基础手写无参装饰器日志统计实战05 进阶带参数装饰器、多层装饰器叠加06 企业级实战缓存、鉴权、性能计时装饰器07 面试高频问答必背01 前置基础函数是一等公民Python中函数是一等对象一等公民拥有三个核心特性这是闭包、装饰器能实现的根本函数可以赋值给变量函数可以作为参数、返回值函数可以嵌套定义内部函数基础示例# 1. 函数赋值给变量defhello():print(Hello Python)fhello f()# 2. 函数作为返回值defouter():definner():print(内部函数执行)returninner resouter()res()核心总结正因为函数可以嵌套、可以返回才诞生了闭包。02 闭包详解定义、条件、原理2.1 闭包的必备三要素同时满足以下3点就是闭包Closure函数嵌套外层函数内层函数内层函数引用外层函数的局部变量外层函数返回内层函数2.2 闭包实战代码defouter(num):# 外层局部变量definner():# 内层引用外层变量print(f传入数值{num})returninner# 接收内层函数funcouter(100)# 调用内层函数func()2.3 闭包核心特性重点正常函数执行结束后局部变量会被销毁释放。但闭包会保留外层函数的局部变量不会被GC回收实现了数据常驻、状态保存。2.4 闭包经典场景计数器defcount_factory():cnt0defcounter():nonlocalcnt cnt1print(f当前计数{cnt})returncounter c1count_factory()c1()# 1c1()# 2c1()# 3知识点nonlocal关键字用于内层函数修改外层嵌套函数的局部变量。03 装饰器本质基于闭包的语法糖3.1 核心认知装饰器 高阶闭包 语法糖装饰器的核心作用在不修改原函数代码、不修改原函数调用方式的前提下给函数新增功能。这就是设计模式中的开闭原则对扩展开放对修改关闭。3.2 装饰器解决的问题避免重复代码日志、计时、鉴权通用逻辑复用业务代码与通用工具代码解耦统一项目规范便于维护迭代04 手写无参装饰器日志统计实战需求给任意函数添加执行日志、执行耗时统计4.1 原生闭包写法理解底层importtimedeftimer_decorator(func):# 通用装饰器接收任意参数defwrapper(*args,**kwargs):starttime.time()# 执行原函数resfunc(*args,**kwargs)endtime.time()print(f函数【{func.__name__}】执行耗时{end-start:.4f}s)# 返回原函数结果returnresreturnwrapper# 测试函数timer_decoratordefcalc_sum(n):s0foriinrange(n):sireturns calc_sum(100000)4.2 装饰器执行流程拆解timer_decorator装饰器加载等价于calc_sum timer_decorator(calc_sum)调用calc_sum()实际执行的是内部包装函数wrapper()wrapper执行前置逻辑 → 执行原函数 → 后置逻辑 → 返回结果4.3 解决函数信息覆盖问题直接使用装饰器会导致原函数的函数名、文档注释被wrapper覆盖需要functools.wraps修复importtimefromfunctoolsimportwrapsdeftimer_decorator(func):wraps(func)defwrapper(*args,**kwargs):starttime.time()resfunc(*args,**kwargs)endtime.time()print(f函数【{func.__name__}】执行耗时{end-start:.4f}s)returnresreturnwrapper05 进阶带参数装饰器 多层装饰器5.1 带参数装饰器普通装饰器只能接收函数参数带参装饰器可以自定义配置参数灵活性更高。需求自定义日志等级控制是否打印日志fromfunctoolsimportwrapsdeflog_decorator(switchTrue):# 外层接收装饰器参数defdecorator(func):wraps(func)defwrapper(*args,**kwargs):ifswitch:print(f【日志】函数{func.__name__}开始执行)resfunc(*args,**kwargs)returnresreturnwrapperreturndecorator# 开启日志log_decorator(switchTrue)deftest_func():print(业务逻辑执行)test_func()5.2 多层装饰器叠加执行顺序加载顺序自下而上执行顺序自上而下口诀先装饰的后执行后装饰的先执行fromfunctoolsimportwrapsdefdeco1(func):wraps(func)defwrapper():print(deco1 前置)func()print(deco1 后置)returnwrapperdefdeco2(func):wraps(func)defwrapper():print(deco2 前置)func()print(deco2 后置)returnwrapperdeco1deco2defhello():print(核心业务执行)hello()06 企业级实战三大装饰器可直接复用6.1 接口鉴权装饰器fromfunctoolsimportwrapsdeflogin_auth(func):wraps(func)defwrapper(user_token,*args,**kwargs):# 模拟鉴权逻辑ifnotuser_token:return{code:401,msg:未登录权限不足}returnfunc(user_token,*args,**kwargs)returnwrapper# 模拟接口login_authdefget_user_info(token):return{code:200,data:用户信息数据}print(get_user_info())6.2 简易缓存装饰器避免重复计算fromfunctoolsimportwrapsdefcache_decorator(func):cache{}wraps(func)defwrapper(*args):ifargsnotincache:cache[args]func(*args)returncache[args]returnwrappercache_decoratordeffib(n):ifn2:return1returnfib(n-1)fib(n-2)print(fib(30))# 首次计算后续直接读取缓存6.3 异常捕获装饰器统一异常处理fromfunctoolsimportwrapsdefexception_catch(func):wraps(func)defwrapper(*args,**kwargs):try:returnfunc(*args,**kwargs)exceptExceptionase:print(f【函数异常】{func.__name__}执行失败{str(e)})returnNonereturnwrapperexception_catchdefdivide(a,b):returna/b divide(10,0)07 面试高频真题必背Q1什么是闭包闭包的作用和缺点答闭包是嵌套函数中内层函数引用外层局部变量、外层返回内层函数的代码结构。作用保存函数执行状态、实现数据常驻、简化代码、实现装饰器。缺点外层变量常驻内存无法释放长期使用会造成内存泄漏。Q2装饰器的原理是什么为什么不修改原代码装饰器基于闭包高阶函数实现通过包装原函数在函数执行前后扩展逻辑符合开闭原则实现业务与通用逻辑解耦。Q3wraps装饰器的作用修复装饰器导致的原函数信息丢失问题保留原函数的__name__、文档注释等属性。Q4多层装饰器的执行顺序加载自下而上执行自上而下先装饰的函数最后执行后置逻辑。

相关新闻

LLM Wiki应用之认知流水线篇——AI Agent读取89份PDF

LLM Wiki应用之认知流水线篇——AI Agent读取89份PDF

75 分钟。89 份 PDF。164 个候选主题。11 个新建页面。20 个更新页面。 这是 2026 年 6 月 19 日,我的 AI Agent 完成的一次批量知识摄入。输入是海思 Hi3519DV500 原厂 SDK 的全部技术文档(89 份 PDF,涵盖芯片手册、编程指南、硬件设计参考、…

2026/6/27 1:44:14阅读更多 →
138、飞控中的GPS选型:Ublox M8N、F9P

138、飞控中的GPS选型:Ublox M8N、F9P

飞控算法从入门到精通(138):飞控中的GPS选型——Ublox M8N与F9P的实战抉择 从一次炸机说起 去年夏天,我在某山区测试一款自研四旋翼。起飞时一切正常,GPS锁定12颗星,HDOP显示0.8,看起来完美。飞到200米外、高度80米时,飞机突然开始剧烈晃动,紧接着一个侧翻,直接栽进…

2026/6/27 1:44:14阅读更多 →
不止湖仓一体!Databricks Lakebase 湖库一体,解锁 AI 原生统一数据底座

不止湖仓一体!Databricks Lakebase 湖库一体,解锁 AI 原生统一数据底座

不止湖仓一体!Databricks Lakebase 湖库一体,解锁 AI 原生统一数据底座2025年Databricks在DataAI峰会上推出了一款数据库:“Lakebase”,这是一款首创的、专为 AI 打造的完全托管 PostgreSQL 数据库。通过 Lakebase,Databricks 为其…

2026/6/27 1:39:13阅读更多 →
鸿蒙(HarmonyOS)- 怎么在DevEcoStudio中通过真机操作日志相关

鸿蒙(HarmonyOS)- 怎么在DevEcoStudio中通过真机操作日志相关

1 连接设备: 在终端执行 hdc list targets 确认设备在线。 2 实时查看: 执行 hdc shell 进入设备 Shell,随后输入 hilog 查看全量日志;支持过滤如 hilog -T "标签" 或 hilog -l D(仅 Debug 级)。 导出日志: hdc hilog &…

2026/6/27 3:04:22阅读更多 →
C语言学习笔记 -63.流程控制17 - 选择9 - if...else if多分支选择与常见错误解析

C语言学习笔记 -63.流程控制17 - 选择9 - if...else if多分支选择与常见错误解析

一、本节学习定位本节属于 流程控制 中的核心内容,重点讲解 if、else if、else 多分支选择结构 的写法与常见错误。在 C 语言中,程序并不是简单地从上到下全部执行。遇到 if 语句 时,程序会根据条件表达式的真假选择不同的执行路径。因此&…

2026/6/27 3:04:22阅读更多 →
用C语言解释野指针

用C语言解释野指针

1. 野指针是什么野指针(Wild Pointer) 是指向未分配、已释放、无访问权限或作用域已销毁的内存区域的指针。对野指针进行解引用、读写操作属于 C 语言标准中的未定义行为:轻则程序直接崩溃(段错误 Segmentation Fault)…

2026/6/27 3:04:22阅读更多 →
天地一体化空间智控基座 平流层飞艇无感定位军营安防平台

天地一体化空间智控基座 平流层飞艇无感定位军营安防平台

一、方案总纲本平台由镜像视界浙江科技有限公司全栈自研打造,核心攻关内容纳入国家十四五重点课题研究序列,依托镜像视界浙江普陀时空大数据应用技术联合研究院完成平流层浮空感知、纯视觉无感定位、全域视频孪生成套技术迭代,全系统通过河南…

2026/6/27 3:04:22阅读更多 →
读信息安全专业考研还是直接就业更划算

读信息安全专业考研还是直接就业更划算

高考志愿填报时,信息安全专业越来越受到考生关注。但很多人在选择这个专业后,会面临一个很实际的问题:本科毕业直接找工作,还是继续读研深造?这个问题没有标准答案,不同选择对应完全不同的发展路径。想清楚…

2026/6/27 3:04:22阅读更多 →
青岛小程序开发公司推荐:九尾狐9大核心优势助力企业数字化升级

青岛小程序开发公司推荐:九尾狐9大核心优势助力企业数字化升级

在青岛,企业做小程序开发时最怕三件事:开发完源码拿不到、功能上线后无法扩展、后期出了问题找不到人维护。青岛九尾狐网络科技有限公司作为青岛本地专业的技术服务商,经过十余年发展沉淀了9大核心优势。优势一:十余年持续深耕。九…

2026/6/27 2:59:22阅读更多 →
【人工智能】一文搞定到底什么是智能体

【人工智能】一文搞定到底什么是智能体

【人工智能】一文搞定到底什么是智能体 一文搞定到底什么是智能体【人工智能】一文搞定到底什么是智能体一. LM,WorkFlow,Agent分别有什么么不同二. Agent的思考过程是怎样的三. Agent的五个核心部分1)LLM2)Prompt3)Me…

2026/6/26 11:03:22阅读更多 →
嵌入式GUI控件实战:ROTARY、SCROLLBAR、SLIDER原理与应用

嵌入式GUI控件实战:ROTARY、SCROLLBAR、SLIDER原理与应用

1. 嵌入式GUI控件:从原理到实战的深度解析在嵌入式系统开发中,图形用户界面(GUI)的设计与实现往往是项目从“能用”到“好用”的关键一跃。不同于资源充沛的PC或移动平台,嵌入式设备的GUI需要在有限的CPU性能、内存空间…

2026/6/26 4:15:25阅读更多 →
Google AI Studio 300美元额度的真相与实战指南

Google AI Studio 300美元额度的真相与实战指南

1. 这300美金不是“送钱”,而是Google埋下的第一道技术门槛 你看到标题里那个醒目的“$300美金”时,第一反应可能是:又一个免费额度?领完就完事?我亲手试过——这300美金根本不是红包,而是一张入场券&…

2026/6/26 9:29:01阅读更多 →
10分钟AI语音克隆与实时变声:Retrieval-based-Voice-Conversion-WebUI完整指南

10分钟AI语音克隆与实时变声:Retrieval-based-Voice-Conversion-WebUI完整指南

10分钟AI语音克隆与实时变声&#xff1a;Retrieval-based-Voice-Conversion-WebUI完整指南 【免费下载链接】Retrieval-based-Voice-Conversion-WebUI Easily train a good VC model with voice data < 10 mins! 项目地址: https://gitcode.com/GitHub_Trending/re/Retrie…

2026/6/27 0:04:03阅读更多 →
Layerdivider:3分钟AI智能分层,彻底告别手动抠图时代

Layerdivider:3分钟AI智能分层,彻底告别手动抠图时代

Layerdivider&#xff1a;3分钟AI智能分层&#xff0c;彻底告别手动抠图时代 【免费下载链接】layerdivider A tool to divide a single illustration into a layered structure. 项目地址: https://gitcode.com/gh_mirrors/la/layerdivider 还在为复杂的图像分层工作烦…

2026/6/27 0:04:03阅读更多 →
Tomcat中X-Frame-Options配置实战:防御点击劫持的四种方法与最佳实践

Tomcat中X-Frame-Options配置实战:防御点击劫持的四种方法与最佳实践

1. 项目概述&#xff1a;为什么X-Frame-Options是Web安全的“防盗门”&#xff1f;最近在排查一个老项目的安全审计报告时&#xff0c;又被提到了“点击劫持”风险&#xff0c;矛头直指缺失的X-Frame-Options响应头。这已经不是第一次了&#xff0c;很多开发团队&#xff0c;尤…

2026/6/27 0:04:03阅读更多 →