Python装饰器的原理详解

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

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

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

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

装饰器函数的逻辑流程

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

这就是装饰器的灵魂设计

例子:

语法糖写法(优雅)

@my_decorator

def func():

pass

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

func = my_decorator(func)

  • 执行时机:函数定义时,Python 解释器自动执行转换,不是函数调用时
  • 本质:把原函数func传给my_decorator,用返回的新函数覆盖原函数名
相关推荐
kyle~1 小时前
FANUC机械臂---R寄存器
开发语言·c++·机器人·fanuc
2201_756847331 小时前
uni-app怎么接极光推送 uni-app消息推送App端接入【教程】
jvm·数据库·python
hef2882 小时前
HTML5中SVG描边虚线Stroke-dasharray的配置技巧
jvm·数据库·python
长沙红胖子Qt2 小时前
Qt实用技巧:多QLabel不规则间距像素对齐文本方式实现
开发语言·qt·字符间距·动态控制
码云数智-园园2 小时前
Go并发编程避坑指南:如何彻底消灭数据竞争(Data Race)
开发语言
Mem0rin2 小时前
[Java/数据结构]树的基本概念、二叉树的创建和遍历
java·开发语言·数据结构
我不是懒洋洋2 小时前
【经典题目】链表OJ(轮转数组、返回倒数第k个节点、链表的回文结构)
c语言·开发语言·数据结构·算法·链表·visual studio
Lyyaoo.2 小时前
【JAVA基础面经】CAS 与 ABA
java·开发语言
Allen_LVyingbo2 小时前
《狄拉克符号法50讲》习题与解析(上)
开发语言·人工智能·python·数学建模·量子计算