高频考点-Python中的装饰器的用法?

发布时间:2026/9/23 13:28:03

高频考点-Python中的装饰器的用法?
这是一个非常经典且重要的Python进阶知识点。一句话理解装饰器就是一个“给函数增加额外功能但不修改函数内部代码”的工具。就像给手机套上手机壳——手机本身没变但多了防摔功能。1. 基础认知一切皆函数在讲装饰器前先记住两点Python中函数可以被当作参数传给另一个函数。Python中函数可以嵌套定义。2. 手动实现一个最简单的装饰器假设你想知道一个函数运行了多长时间但不想在每个函数里都写计时代码。import time # 这是一个装饰器函数 def timer(func): def wrapper(*args, **kwargs): # *args, **kwargs 保证能接收任意参数 start time.time() result func(*args, **kwargs) # 真正执行原函数 end time.time() print(f函数 {func.__name__} 运行了 {end - start:.4f} 秒) return result return wrapper # 使用装饰器语法糖 timer def slow_function(): time.sleep(1) return 完成 # 调用时完全无感知 print(slow_function()) # 输出函数 slow_function 运行了 1.0002 秒 # 完成背后原理timer等价于执行了slow_function timer(slow_function)也就是把原函数替换成了wrapper。3. 带参数的装饰器三层结构如果你的装饰器本身需要接收参数比如指定超时时间需要再包装一层def repeat(times): # 这是装饰器工厂接收参数 def decorator(func): # 这是真正的装饰器 def wrapper(*args, **kwargs): for _ in range(times): result func(*args, **kwargs) return result return wrapper return decorator repeat(times3) # 调用时带上参数 def say_hello(): print(Hello) say_hello() # 会打印 3 次 Hello4. 保留原函数的元信息重要使用装饰器后原函数的__name__、__doc__等会被wrapper覆盖调试时会困惑。标准做法是加上functools.wrapsfrom functools import wraps def timer(func): wraps(func) # 这一行把原函数的信息复制给 wrapper def wrapper(*args, **kwargs): # ... 计时逻辑 return func(*args, **kwargs) return wrapper5. 类装饰器用类来实现除了用函数还可以用类来实现装饰器通过__call__魔法方法class CountCalls: def __init__(self, func): self.func func self.count 0 def __call__(self, *args, **kwargs): self.count 1 print(f第 {self.count} 次调用) return self.func(*args, **kwargs) CountCalls def test(): print(执行) test() # 第 1 次调用 test() # 第 2 次调用6. 实际开发中最常用的场景场景说明登录校验检查用户是否登录未登录则跳转权限控制检查当前用户是否有权限执行该操作日志记录自动记录函数的入参、返回值、异常缓存如lru_cache对相同参数直接返回缓存结果重试机制函数报错时自动重试 N 次路由注册Flask/FastAPIapp.route(/)就是装饰器7. 一个常见的坑装饰器顺序多个装饰器叠加时执行顺序是自下而上从靠近函数的开始a b c def func(): pass # 实际执行顺序func a(b(c(func)))8. 如果你刚接触给你一个万能模板以后写任何装饰器直接套这个模板不会出错from functools import wraps def my_decorator(func): wraps(func) def wrapper(*args, **kwargs): # 在调用前做点什么 result func(*args, **kwargs) # 在调用后做点什么 return result return wrapper最后送你一个思考装饰器本质上是“面向切面编程”AOP的一种实现它把业务逻辑核心功能和辅助逻辑日志、计时、校验分离开让代码更干净。

相关新闻

大模型稀疏化存储的格式选型实战:CSR、CSC 与 Block Sparse 在 MCU 端的解压开销与带宽博弈

大模型稀疏化存储的格式选型实战:CSR、CSC 与 Block Sparse 在 MCU 端的解压开销与带宽博弈

2026/9/8 10:16:49

大模型稀疏化存储的格式选型实战:CSR、CSC 与 Block Sparse 在 MCU 端的解压开销与带宽博弈 一、稀疏矩阵在 MCU 上的存储死结:90% 的 Flash 被零值权重占据 模型剪枝是边缘部署中最有效的压缩手段之一。以 Magnitude Pruning 对 MobileNetV2 进行 70% 稀…

Easy-Query隐式Join实战:让多表关联查询变得简单高效

Easy-Query隐式Join实战:让多表关联查询变得简单高效

2026/8/31 16:51:38

Easy-Query隐式Join实战:让多表关联查询变得简单高效 【免费下载链接】easy-query java/kotlin high performance lightweight solution for jdbc query,support oltp and olap query,一款java下面支持强类型、轻量级、高性能的ORM,致力于解决jdbc查询,拥有对象模型…

CANN/asc-devkit:asc_exp_sub函数(废弃)说明

CANN/asc-devkit:asc_exp_sub函数(废弃)说明

2026/8/23 0:10:12

asc_exp_sub (废弃) 【免费下载链接】asc-devkit 本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言,原生支持C和C标准规范,主要由类库和语言扩展层构成,提供多层级API,满足多维场景算子开发诉求。 项目地址: https://git…

CANN/GE ACL数据集缓冲区添加函数

CANN/GE ACL数据集缓冲区添加函数

2026/9/21 18:38:46

aclmdlAddDatasetBuffer 【免费下载链接】ge GE(Graph Engine)是面向昇腾的图编译器和执行器,提供了计算图优化、多流并行、内存复用和模型下沉等技术手段,加速模型执行效率,减少模型内存占用。 GE 提供对 PyTorch、Te…

用ffmpeg高效批量调整图片尺寸的实战指南

用ffmpeg高效批量调整图片尺寸的实战指南

2026/9/21 18:41:09

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

Transformers 音频特征提取工具库 audio_utils 全解析:从 Mel 刻度换算到对数 Mel 频谱

Transformers 音频特征提取工具库 audio_utils 全解析:从 Mel 刻度换算到对数 Mel 频谱

2026/9/21 18:36:40

Transformers 音频特征提取工具库 audio_utils 全解析:从 Mel 刻度换算到对数 Mel 频谱 【免费下载链接】transformers 🤗 Transformers: the model-definition framework for state-of-the-art machine learning models in text, vision, audio, and mu…

RustFS 多节点集群重启与滚动升级实战:Readiness、Quorum 与 Degraded 模式完全指南

RustFS 多节点集群重启与滚动升级实战:Readiness、Quorum 与 Degraded 模式完全指南

2026/9/21 18:37:26

RustFS 多节点集群重启与滚动升级实战:Readiness、Quorum 与 Degraded 模式完全指南 【免费下载链接】rustfs 🚀2.3x faster than MinIO for 4KB object payloads. RustFS is an open-source, S3-compatible high-performance object storage system sup…

Java Integer缓存揭秘:128陷阱原理、避坑与面试全解

Java Integer缓存揭秘:128陷阱原理、避坑与面试全解

2026/9/21 18:40:29

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

RustFS Scanner 数据用量发布权威性决策:配额准入如何获得可用的权威依据

RustFS Scanner 数据用量发布权威性决策:配额准入如何获得可用的权威依据

2026/9/21 18:36:17

RustFS Scanner 数据用量发布权威性决策:配额准入如何获得可用的权威依据 【免费下载链接】rustfs 🚀2.3x faster than MinIO for 4KB object payloads. RustFS is an open-source, S3-compatible high-performance object storage system supporting mi…

远程协作的工作台整理

远程协作的工作台整理

2026/9/22 0:19:28

远程协作的工作台整理远程协作的核心不是再加一个工具,而是让交接信息足够完整。异步任务要写明目标、输入位置、完成标准和需要决策的人。 工作台的最小配置 将日程、待办、代码和沟通入口收拢到少数固定位置;通知按紧急程度分层。工作台不需要模仿办公…

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

2026/9/21 23:38:13

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

2026/9/22 0:48:53

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…