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

python装饰器解释

一开始感觉有点难理解,不知道为啥,但是看了这段代码就秒懂了。

这就是一个简单的装饰器的例子:说白了就是在装饰器里新建了一个新函数,新函数会调用老函数,但是会自己装饰一些内容。最后返回这个新函数替代老函数的返回。

def decorator(old_func): def new_func(): print("调用前") old_func() print("调用后") return new_func

含义是:

decorator(old_func):接收旧函数
new_func():定义一个新函数
old_func():在新函数里面调用旧函数
return new_func:把新函数返回出去,替换原来的函数名

所以之后:

@decorator def hello(): print("hello")

等价于:

def hello(): print("hello") hello = decorator(hello)

最后 hello() 实际执行的是 new_func():

调用前
hello
调用后

不过注意:不是所有装饰器都必须这么写。

有些装饰器只是做“注册”,然后原样返回旧函数:

def decorator(old_func): registry.append(old_func) return old_func

这种没有新函数包装,只是把函数登记一下。

有个很好的例子:(下面没有过多的装饰,只是把老函数注册到了一个字典)

class A2AServer: def __init__(self): self.skills = {} # 存放所有技能 def skill(self, name): # 这一层接收技能名称(如 "multiply"),返回一个装饰器函数 def decorator(func): # 这一层接收你写的函数,把它注册到 skills 字典里 self.skills[name] = func print(f"✅ 技能 '{name}' 注册成功") return func # 这里原样返回你的函数 return decorator # 现在你就能用上面那种写法了 calculator = A2AServer() @calculator.skill("multiply") def multiply_numbers(query): return "计算结果..." # 检查是否注册成功 print(calculator.skills) # {'multiply': <function multiply_numbers ...>}

Python 解释器看到@,知道要执行:

multiply_numbers = calculator.skill("multiply")(multiply_numbers)

第三步:calculator.skill("multiply")

调用skill方法,传入"multiply"

def skill(self, name): # name = "multiply" def decorator(func): # 还没执行,只是定义了内部函数 self.skills[name] = func print(f"✅ 技能 '{name}' 注册成功") return func return decorator # 返回 decorator 这个函数本身

calculator.skill("multiply")的返回值是decorator这个函数。

此时代码等价于:

multiply_numbers = decorator(multiply_numbers)

第四步:decorator(multiply_numbers)

multiply_numbers这个函数作为参数,调用decorator

def decorator(func): # func = multiply_numbers 这个函数 self.skills[name] = func # self.skills["multiply"] = multiply_numbers print(f"✅ 技能 '{name}' 注册成功") # 输出: ✅ 技能 'multiply' 注册成功 return func # 返回 multiply_numbers 本身

decorator做了两件事:

  1. multiply_numbers存进calculator.skills["multiply"]

  2. multiply_numbers原样返回


第五步:multiply_numbers = decorator(multiply_numbers)

decorator返回了multiply_numbers本身,又赋值给multiply_numbers

所以multiply_numbers还是原来的函数,没有变。只是在这个过程中被"注册"到了calculator.skills字典里。

【定义阶段,代码加载时】

1. calculator = A2AServer()
→ calculator.skills = {}

2. @calculator.skill("multiply")
→ 调用 calculator.skill("multiply")
→ 返回 decorator 函数
→ 调用 decorator(multiply_numbers)
→ self.skills["multiply"] = multiply_numbers
→ 输出: ✅ 技能 'multiply' 注册成功
→ 返回 multiply_numbers
→ multiply_numbers = multiply_numbers(不变)

3. print(calculator.skills)
→ 输出: {'multiply': <function multiply_numbers at 0x...>}

总结:所以装饰器是什么?就是接收一个老函数,返回一个新函数。但是新函数里面也会执行老函数,不过会增加一点装饰逻辑。

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

相关文章:

  • 终极HTTP请求控制指南:如何用HeaderEditor轻松掌握浏览器网络调试
  • 小程序开发工具哪款更实用?2026多家测评后推荐 - 维双云小凡
  • 小学生能听懂的:二叉树、满二叉树、完全二叉树的区别 - 大厂扫地工
  • 打样怕贵怕慢?万盛精密钣金打样全流程解密:首件确认快,大货才能稳 - 品牌推荐大师
  • 卧槽!The US is winning the AI race where it matters most: commercialization——今天的 HN 热门让我懵了
  • ReadCat小说阅读器完整指南:如何打造纯净无干扰的数字阅读空间
  • 5分钟搭建PUBG战场雷达:免费实现上帝视角的终极指南
  • 如何快速构建智能图像篡改检测系统:3步实战指南
  • 2026 深圳 App 开发公司崛起 创新定制服务各具优势 - 软件测评师
  • Backtrader 终极指南:Python量化交易回测的完整解决方案
  • 如何快速配置高效磁力搜索工具:magnetW完整入门指南
  • 2026年5月PLC厂家推荐:十大排名产品评测工厂产线防宕机痛点
  • 手把手教你排查:CH343在Win10/Win11上插上没反应?从设备管理器到驱动安装的完整排错指南
  • 防爆电磁流量计十大品牌选购清单,安全不降级 - 仪表人叶工
  • Midjourney 35mm风格生成失效真相(35mm胶片模拟底层机制大起底)
  • 中央空调计费系统:电磁式冷热量表十大品牌推荐 - 仪表人叶工
  • Fire Dynamics Simulator实战指南:从零构建火灾模拟专家系统
  • 如何处理SQL空值填充_利用IFNULL函数保证数据完整性
  • 3步掌握微信小程序逆向工程:wxappUnpacker深度剖析与实战指南
  • 2026年钣金件加工:解读制造业三大核心趋势 - 速递信息
  • PyFluent终极指南:如何用Python脚本彻底改变你的CFD仿真工作流 [特殊字符]
  • 5分钟构建大麦网自动化购票系统:告别手动抢票的技术解决方案
  • 2026沈阳罗杰杜彼名表回收避坑测评,五家门店计价规则对比 - 奢侈品回收测评
  • 用ZCU106开发板实测Xilinx VCU硬核:手把手教你搭建4K@60超低延时视频流(附Gstreamer命令详解)
  • 卧槽!Princeton mandates proctoring for in-person exams, upending 133 year precedent——今天的 HN 热门让我懵了
  • LinkSwift网盘直链下载助手:告别限速,实现九大网盘全速下载的终极指南
  • Pearcleaner终极指南:如何彻底清理Mac应用残留文件
  • 如何高效拆分CATIA多实体零件:pycatia自动化解决方案的完整指南
  • 2026 漯河家具店沙发茶几软床床垫餐桌椅靠谱推荐,中古风家具、实木家具、宋式美学家具同城权威选购指南排行 - 品牌智鉴榜
  • 题解:luogu P6697([BalticOI 2020] 村庄 (Day2))