当前位置: 首页 > news >正文

装饰器原理、手写装饰器、带参装饰器、装饰器嵌套全解

博客导语

装饰器底层=高阶函数+闭包,遵循开闭原则:不修改原函数代码、不修改调用方式,动态扩展功能。面试必考四大形态:无参、传参兼容、带参装饰器、多层嵌套,同时解决函数签名丢失经典坑。


一、基础无参装饰器(原生手写)

@装饰器是语法糖,等价于func = wrapper(func)

def log_decorator(func): # 内层闭包函数 def inner(*args,**kwargs): print("函数开始执行") ret = func(*args,**kwargs) # 执行原函数 print("函数执行结束") return ret return inner @log_decorator def add(a,b): return a+b add(1,2)

二、修复函数签名丢失

直接装饰后add.__name__会变成inner,导致日志、异常栈错乱,必须用wraps修复

from functools import wraps def log_decorator(func): @wraps(func) def inner(*args,**kwargs): ... return inner

三、带参数装饰器(三层嵌套)

场景:装饰器需要传入自定义参数,例如自定义日志前缀、超时时间,需要三层函数

def log_prefix(prefix): # 第一层接收装饰器参数 def outer(func): @wraps(func) def inner(): print(f"[{prefix}]函数执行") func() return inner return outer @log_prefix("INFO") def hello(): print("hello")

四、装饰器嵌套执行顺序

从上到下装饰,从下到上执行。外层装饰器先包裹内层;执行时内层前置逻辑先运行,外层后置逻辑先运行。


五、生产使用场景

接口权限校验、接口耗时统计、日志埋点、缓存击穿、异常统一捕获

http://www.jsqmd.com/news/1015610/

相关文章:

  • 2026北京铁艺公司实力观察:从工艺细节到项目落地,谁在持续输出交付力? - 优质品牌商家
  • 避坑指南:用STM32 HAL库驱动E18-D80NK,为什么你的中断总误触发?
  • 从‘无法打印02’看联想M7206这类鼓粉分离打印机的日常保养避坑指南
  • 别再只用双线性插值了!深入对比CARAFE、Deconv与Upsample在YOLOv5中的性能差异
  • 卫星遥感与机器学习在考古遗址保护中的创新应用
  • 手机信号差?别急着换手机,先看看中频放大器这个“信号心脏”
  • 避坑指南:用STM32CubeMX配置E18-D80NK红外传感器中断,解决误触发和电平不稳问题
  • 2026年智能电磁流量计口碑解析:耐用性与工程适配深度评测 - 优质品牌商家
  • 网络内容安全与合规创作指南:技术博主的红线意识
  • 2026年国内FFU厂家排名及行业发展分析 - 品牌排行榜
  • 深入Vitis平台工程:从‘fatal error: xxx.h’报错理解BSP的Makefile机制
  • 字节/字符输入输出流、缓冲流
  • 手把手教你排查H3C IRF堆叠失败:从‘dis irf’看不懂到秒懂状态信息的实战教程
  • ESP-IDF在VSCode里死活找不到头文件?别慌,我整理了这份终极排查手册(附.c_cpp_properties.json模板)
  • 2026动物实验找哪家做?专业机构选择参考 - 品牌排行榜
  • 从Good到Bad:深入理解OPC UA状态码背后的设计哲学与最佳实践
  • 2026永城奔驰宝马奥迪维修靠谱的门店推荐 - 品牌排行榜
  • 光学级CVD金刚石单晶片:制备工艺与性能优势解析
  • 从‘镜子’到‘智能画笔’:一文看懂RIS(可重构智能超表面)如何重塑无线信号
  • 告别玄学调网:用示波器给STM32H743的RMII接口做一次“体检”(附LAN8720A实测波形)
  • STM32串口接收中断‘幽灵’BUG排查实录:从ORE标志位到彻底关闭中断的实战
  • 从水仙花数到八位自幂数:用Python和C++探索‘自幂数’家族的奥秘
  • GitLab启动慢到怀疑人生?别急着重启,先看看你的服务器内存够不够
  • 别再为Unity安卓打包报错头疼了!手把手教你配置正确的NDK和JDK版本(附各版本对应表)
  • 2026年汽车清洗用品行业现状:正规厂家与源头供应商深度分析 - 优质品牌商家
  • CANN神经网络算子库ops-nn完全指南:昇腾NPU上神经网络算子的分类体系、调用接口与性能特征详解
  • 别再傻傻分不清了!一文搞懂ISO/IEC 14443、15693、18000系列RFID标准到底有啥区别
  • 保姆级教程:手把手修复STM32CubeIDE的ST-LINK GDB服务端(从卸载重装到端口配置)
  • 【无人机协同无人艇】基于原算法 最大熵-信息素算法 3D地形通信增强算法实现无人机和无人艇跨海跨岛实现岸海协同搜索覆盖附Matlab仿真
  • RK3568接5G模组踩坑记:为什么你的USB网卡识别了却上不了网?