Python装饰器的原理详解

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

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

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

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

装饰器函数的逻辑流程

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

这就是装饰器的灵魂设计

例子:

语法糖写法(优雅)

@my_decorator

def func():

pass

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

func = my_decorator(func)

  • 执行时机:函数定义时,Python 解释器自动执行转换,不是函数调用时
  • 本质:把原函数func传给my_decorator,用返回的新函数覆盖原函数名
相关推荐
WJ.Polar7 小时前
Scapy基本应用
linux·运维·网络·python
CSCN新手听安8 小时前
【Qt】Qt窗口(六)QMessageBox消息对话框的使用
开发语言·c++·qt
H_unique8 小时前
LangChain:调用工具Ⅲ
python·langchain
醉舞经阁半卷书18 小时前
深入掌握LangChain
python·langchain
CDN3608 小时前
[硬核] 你的DNS正在“裸奔”?用Python手撕DNS劫持与隧道检测逻辑
开发语言·网络·python
froginwe119 小时前
jQuery 添加元素
开发语言
zhangfeng11339 小时前
PHP 语法检查命令 php -l “$file“ > /dev/null 2>&1;
开发语言·php
csbysj20209 小时前
解释器模式
开发语言
kybs19919 小时前
springboot视频推荐系统--附源码72953
java·spring boot·python·eclipse·asp.net·php·idea
CoderCodingNo9 小时前
【信奥业余科普】C++ 的奇妙之旅 | 20:更安全的间接访问——引用的设计动机与实战对比
开发语言·c++