NEWS DETAIL

Python高阶精讲:闭包与装饰器彻底吃透(零基础看懂+实战源码)

发布时间:2026/10/25 17:51:09 · 栏目:资讯中心

尧图网络原创建站知识分享正文
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多层装饰器的执行顺序加载自下而上执行自上而下先装饰的函数最后执行后置逻辑。
✦

本文为尧图网络原创建站知识分享。想针对自身行业获取定制化建站方案?欢迎咨询,资深顾问免费为你出思路。

RELATED

相关 资讯推荐

MORE

更多 新鲜资讯

JMeter入门实战:从零构建HTTP接口性能测试脚本与结果分析
2026/10/25 15:06:20

JMeter入门实战:从零构建HTTP接口性能测试脚本与结果分析

1. 项目概述:从零开始,用JMeter搞定HTTP性能测试 刚接触性能测试的新手,或者是从功能测试转过来的朋友,一听到“压测”两个字,心里可能就有点发怵。工具那么多,概念那么杂,从哪儿下手呢&#xf…

Earendel: 一个纯TS写的POSIX兼容的微内核Web操作系统
2026/10/24 20:39:51

Earendel: 一个纯TS写的POSIX兼容的微内核Web操作系统

最近我用TypeScript写了一个运行在浏览器里的Web操作系统 Earendel(目前已知的距离地球最遥远的恒星)。开发它的初衷主要是为了Linux和操作系统课程的教学。市面上绝大多数Web OS项目,要么只是做了一个长得像Windows/macOS的网页UI拼盘&#…

5分钟掌握Windows防撤回神器:让微信QQ撤回消息无处遁形[特殊字符]
2026/10/25 8:02:16

5分钟掌握Windows防撤回神器:让微信QQ撤回消息无处遁形[特殊字符]

5分钟掌握Windows防撤回神器:让微信QQ撤回消息无处遁形🚀 【免费下载链接】RevokeMsgPatcher :trollface: A hex editor for WeChat/QQ/TIM - PC版微信/QQ/TIM防撤回补丁(我已经看到了,撤回也没用了) 项目地址: http…

从零制作同人动画:技术路线、流程与实战避坑指南
2026/10/25 15:27:07

从零制作同人动画:技术路线、流程与实战避坑指南

1. 先搞清楚这个“粉丝动画”到底是什么,以及它能解决什么问题看到“五条悟VS宿傩/咒术回战粉丝动画”这个标题,很多人的第一反应可能是去找一个现成的视频。但如果你是一个想自己动手创作、或者想了解这类作品背后技术流程的创作者,这个标题…

闭源降价80%,开源却在涨价:AI定价的交叉路口
2026/10/24 22:16:44

闭源降价80%,开源却在涨价:AI定价的交叉路口

8月6日,两条价格曲线悄然交汇。 一条向下:OpenAI把GPT-5.6 Luna的输出价格从6美元砍到1.2美元/百万Token,降幅80%。另一条向上:同一天,DeepSeek公告全线涨价,措辞是"涨幅较大",非试探…

产线三防平板选哪个牌子?5个品牌实测告诉你别瞎买
2026/10/25 8:02:07

产线三防平板选哪个牌子?5个品牌实测告诉你别瞎买

产线三防平板选哪个牌子?5个品牌实测告诉你别瞎买经常有工厂朋友拿着网上的"三防平板十大品牌排行榜"来问我:到底选哪个?说实话排行榜看看就行,真正选型得看你产线什么场景。今天挑五个在产线数字化里用得比较多的品牌—…

看完这篇,还想了解更多?

预约尧图网络顾问一对一沟通,针对你的行业与现状给出建站建议,全程免费。

免费咨询