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

发布时间:2026/7/16 19:00:26

高频考点-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/7/16 18:50:26

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

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

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

2026/7/16 18:50:26

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/7/16 18:50:26

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

CANN/asc-devkit L0A内存初始化

CANN/asc-devkit L0A内存初始化

2026/7/16 20:10:30

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

Jupyter Lab集成Optuna Dashboard:在 notebook 中实时追踪你的优化实验

Jupyter Lab集成Optuna Dashboard:在 notebook 中实时追踪你的优化实验

2026/7/16 20:10:30

Jupyter Lab集成Optuna Dashboard:在 notebook 中实时追踪你的优化实验 【免费下载链接】optuna-dashboard Real-time Web Dashboard for Optuna. 项目地址: https://gitcode.com/gh_mirrors/op/optuna-dashboard Optuna Dashboard 是一个强大的实时Web仪表板…

DeepMosaics终极指南:3分钟掌握AI马赛克智能处理技术

DeepMosaics终极指南:3分钟掌握AI马赛克智能处理技术

2026/7/16 20:10:30

DeepMosaics终极指南:3分钟掌握AI马赛克智能处理技术 【免费下载链接】DeepMosaics Automatically remove the mosaics in images and videos, or add mosaics to them. 项目地址: https://gitcode.com/gh_mirrors/de/DeepMosaics 在数字内容爆炸式增长的时代…

局域网文件共享超过 10 人后,为什么必须有权限和审计

局域网文件共享超过 10 人后,为什么必须有权限和审计

2026/7/16 20:10:30

局域网文件共享超过 10 人后,为什么必须有权限和审计 很多企业文件混乱,不是因为员工不会传文件,而是因为系统默认把所有人当成同一种人。 一开始,大家都能访问同一个目录,看起来很方便。可一旦使用人数超过 10 人&a…

企业内网文件共享,为什么 SMB、FTP 和网盘都不够用

企业内网文件共享,为什么 SMB、FTP 和网盘都不够用

2026/7/16 20:10:30

企业内网文件共享,为什么 SMB、FTP 和网盘都不够用 很多公司一开始并没有打算建设“文件管理系统”。最早只是同事之间传几个文件:设计稿、合同、报价单、安装包、图纸、视频素材。 问题通常从一个很小的需求开始:不要用微信传大文件&#…

Dropify样式自定义:从基础主题到完全定制化的CSS技巧

Dropify样式自定义:从基础主题到完全定制化的CSS技巧

2026/7/16 20:00:29

Dropify样式自定义:从基础主题到完全定制化的CSS技巧 【免费下载链接】dropify Override your input files with style — Demo here : http://jeremyfagis.github.io/dropify 项目地址: https://gitcode.com/gh_mirrors/dr/dropify Dropify是一款功能强大的…

Unity游戏文本翻译架构深度解析:XUnity.AutoTranslator的技术实现与工程实践

Unity游戏文本翻译架构深度解析:XUnity.AutoTranslator的技术实现与工程实践

2026/7/16 0:35:09

Unity游戏文本翻译架构深度解析:XUnity.AutoTranslator的技术实现与工程实践 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator XUnity.AutoTranslator作为Unity游戏社区中最成熟的文本翻译解决方…

openEuler Raspberry Pi Kernel设备驱动开发指南:为树莓派硬件添加支持

openEuler Raspberry Pi Kernel设备驱动开发指南:为树莓派硬件添加支持

2026/7/16 14:29:31

openEuler Raspberry Pi Kernel设备驱动开发指南:为树莓派硬件添加支持 【免费下载链接】raspberrypi-kernel It provides openEuler kernel source for Raspberry Pi 项目地址: https://gitcode.com/openeuler/raspberrypi-kernel 前往项目官网免费下载&…

openEuler系统集成测试实战:基于smoke-test套件的环境验证技巧

openEuler系统集成测试实战:基于smoke-test套件的环境验证技巧

2026/7/16 14:18:17

openEuler系统集成测试实战:基于smoke-test套件的环境验证技巧 【免费下载链接】integration-test The repo contains test suits for system integration test 项目地址: https://gitcode.com/openeuler/integration-test 前往项目官网免费下载:…

Python实现跨境电商商品图批量翻译教程

Python实现跨境电商商品图批量翻译教程

2026/7/16 0:09:31

一、问题引入做跨境电商的卖家朋友,你是否遇到过这样的困扰?每次上架新品到亚马逊、Shopee或Lazada等平台,都需要处理大量商品图片的多语言版本。比如上架200款衣服,每款需要翻译成英语、日语、韩语等5种语言,这意味着…

跨境电商多语言商品图翻译方案实现

跨境电商多语言商品图翻译方案实现

2026/7/16 0:09:31

一、问题引入对于做跨境电商的卖家来说,多语言商品图的制作一直是令人头疼的环节。当你准备在亚马逊、Shopee、Lazada等多个平台同步上架新品时,首先遇到的就是图片翻译问题。以一位做家居用品的卖家为例,他需要将200张商品图片中的英文文案全…

Windows系统文件d3dx9_36.dll丢失找不到问题解决

Windows系统文件d3dx9_36.dll丢失找不到问题解决

2026/7/16 0:09:31

在使用电脑系统时经常会出现丢失找不到某些文件的情况,由于很多常用软件都是采用 Microsoft Visual Studio 编写的,所以这类软件的运行需要依赖微软Visual C运行库,比如像 QQ、迅雷、Adobe 软件等等,如果没有安装VC运行库或者安装…