Python装饰器的原理详解

Python 中函数和普通变量完全等价:

  • 可以赋值给变量 :a = print → a("hello") 等价于 print("hello")
  • 可以作为参数传递
  • 可以作为返回值
  • 可以嵌套定义:在函数内部再定义函数

这是装饰器能发挥作用的根本前提。

@装饰器就是一个语法糖,本质 上就是接收一个函数作为参数,并且返回一个新函数的高阶函数,从而实现不修改原函数,却给函数加新功能。

装饰器函数的逻辑流程

  • 接收旧函数:装饰器作为高阶函数,接收被装饰的原函数
  • **内部创建一个包装函数:**在装饰器内部定义一个包装函数,新增想要实现的函数功能
  • 再在包装函数里面调用旧函数:对旧函数进行装饰
  • 返回装饰后的新函数:替换原函数(新旧函数名不变)

这就是装饰器的灵魂设计

例子:

语法糖写法(优雅)

@my_decorator

def func():

pass

完全等价的原生写法(啰嗦)

func = my_decorator(func)

  • 执行时机:函数定义时,Python 解释器自动执行转换,不是函数调用时
  • 本质:把原函数func传给my_decorator,用返回的新函数覆盖原函数名
相关推荐
乌暮33 分钟前
深入理解 Java 泛型:把「万能盒子」用对、用稳
java·开发语言·后端·学习
2601_962218611 小时前
C语言中三种库的编译和使用方法
开发语言·c++
传奇开心果编程1 小时前
中庸、有容、破执:仓颉编程语言的中华智慧结晶——三重哲学境界思辨
开发语言·华为·开源·软件工程
jimy11 小时前
派生类重写基类虚函数(二):override的作用
开发语言·c++
_upupup2 小时前
异常(C++)
java·开发语言·jvm
ebiobiz2 小时前
基于 GD32 Embedded Builder (GEB) 与 Nimmake 的 MCU 工程搭建指南
c++·python·单片机·嵌入式硬件·mcu
霸道流氓气质2 小时前
ComfyUI 图像生成工作流完全指南:从节点编排到Java生产级图像生产实战
java·开发语言·人工智能
老歌老听老掉牙2 小时前
穿越时空的物流密码:VRP与VRPTW的深度剖析及实战求解
python·物流·vrp
FYKJ_20102 小时前
django电影推荐系统55066-计算机课程设计、毕业设计
vue.js·spring boot·python·mysql·typescript·spark·django
ShyanZh3 小时前
【Python3基础】13-Python 常用设计模式
开发语言·python·设计模式