首页
/
行业洞察
/
正文
INDUSTRY INSIGHT · 深度
Python装饰器是什么?一文教你搞懂烦人的Python装饰器!!
📅 2026/9/8 17:39:21
✍️ 爱科研究院
👁 阅读 3,247
对于学习java的人来说应该知道装饰器是在java中的一种设计模式作用是包装对象场景类似IO流但在python中他的应用就比较广了本质就是语法糖高阶函数用函数包装函数Java 装饰器 用类包装对象运行时动态组合功能Python 装饰器 用函数包装函数定义时静态替换功能一句话概括python中的装饰器就是装饰器 不修改原函数和调用方式给函数额外加一层功能另外python还结合了语法糖举个例子就是加日志def log(): print(我在加班) log()输出就是 我在加班加上日志的话就是这样def log(): print(fINFO_日志开始) print(我在加班) print(fINFO_日志结束) log()输出就是INFO_日志开始 我在加班 INFO_日志结束但是这样就改变了原来的函数本身可能会影响他本来的功能我们有个想法就是将他抽出来def fun(): print(我在上班) def logs(func): print(INFO_日志开始) func() print(INFO_日志结束) logs(fun) 输出就是 INFO_日志开始 我在上班 INFO_日志结束不改函数本身也不改调用方式和闭包的写法差不多只不过装饰器接受的是一个函数装饰器一般就干三件事接收一个函数作为参数嵌套一个 wrapper 函数——在里面调用原函数并附加额外功能返回这个 wrapper 函数一般通用的写法就是用语法糖代替示例话那个函数写法就如下面这样from functools import wraps def cat(func): count 0 wraps(func) #作用保留原来函数的__name__、__doc__名称和注解 wraps 本身是一个有参装饰器它接收 func 作为参数然后把 func 的属性复制给 wrapper def wrapper(*args,**kwargs): nonlocal count count 1 print(f第{count}次调用) return func(*args,**kwargs) return wrapper #直接调用就是 语法糖省略了 c cat(say) c() cat def say(): print(hello) say()输出就是这样第1次调用 hello小结装饰器 闭包 语法糖——不改原函数、不改调用方式给函数加功能wrapper 用*args, **kwargs接所有参数有返回值要 return带参数的装饰器 三层嵌套别忘了functools.wraps装饰器也可以加入参def log(level): def decorator(func): def wrapper(*args, **kwargs): print(f[{level}] 开始执行) result func(*args, **kwargs) print(f[{level}] 执行结束) return result return wrapper return decorator log(levelINFO) def hello(): print(hi) hello()输入为[INFO] 开始执行 hi [INFO] 执行结束写装饰器时必须加 wraps(func) 来保留原函数的 __name__ 和 __doc__wrapper 的参数要写成 *args, **kwargs 来通吃所有参数wrapper 内部一定要 return func(*args, **kwargs) 把原函数的结果传出去使用时无参装饰器不加括号、有参装饰器才加括号多个装饰器叠加时从下往上执行离函数最近的先执行。装饰器在python中经常用来做web路由权限校验日志计时缓存等类似java中的aop切面和缓存等或者公共模块
📌 标签:
工业官网
设计趋势
AI 建站
SEO
获取完整报告 →
RELATED ARTICLES
推荐阅读
2026/9/8 17:39:21
医学影像深度学习项目复现:心脏分割与疾病诊断全流程指南
2026/9/8 17:39:21
SL-WX-Captcha 行为验证组件(三合一)
2026/9/8 17:39:21
SL-WX-FlipCard 翻转卡片组件
2026/9/8 19:14:34
Web-Dev-For-Beginners 太空射击课完结篇实战:用多结局条件与重启机制从零构建自己的示例游戏
2026/9/8 19:14:34
损失超8800万美元:Coldcard硬件钱包漏洞分析与被盗资金追踪
2026/9/8 19:14:34
拆解速腾聚创RS-Lidar-16:国产首款16线激光雷达硬件方案深度解析
2026/9/8 19:14:34
使用 Remotion + Next.js App Router 构建可编程视频应用:template-next-app-tailwind 模板完整指南
2026/9/8 19:14:34
逆转 RAG:LLM‑wiki 的知识复利
2026/9/8 19:09:32
DeepSeek Harness插件生态实战:从安装到排错的完整指南
2026/9/8 0:02:01
中国车企再破谣言,GAC吉利零跑获欧盟安全五星
2026/9/8 0:02:01
Compose Hot Reload新增MCP服务器助AI智能体调试
2026/9/8 0:02:01
你熟悉的GoPro正在悄然改变
2026/9/8 0:43:11
超人会飞不算本事:系统稳定依赖清晰规则与边界设计
2026/9/8 1:13:27
超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论
2026/9/8 2:18:22
基于CNN的调制信号识别:MATLAB实现时频图分类实战