恒美微站 Logo 恒美微站
  • 首页
  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心
  • 联系我们

python基础语法学习: 装饰器

  • 首页
  • 资讯中心
  • /
  • python基础语法学习: 装饰器

相关资讯

厂商无关的元器件搜索引擎:Parts.io 如何重塑硬件选型与替代料搜索 2026/8/27 11:24:23
基于SpringBoot的毕业生离校管理系统(源代码+文档+PPT+调试+讲解) 2026/8/27 11:24:23
Windows 11设置应用故障排查与修复指南 2026/8/27 11:19:23

最新资讯

Android性能优化难题一文总结
【Agent】3. FunctionAgent / AgentWorkflow 基础介绍
Android技术面试的三个坑,很多人都遇到过
写码如写诗,Android代码规范有多重要?附阿里《Android代码规范指南》PDF
KMS_VL_ALL_AIO 本地KMS激活脚本:新手从安装到验证的完整指南
条件扩散模型生成病理图像的评估要点与实战指南

今日推荐

Go语言构建企业级AI服务网关:统一管理英伟达等AI接口调用
LeetCode Hot100(51-60)算法精解与面试技巧
CRC校验实战:从模2除法到HJ212协议排错

本周热门

Nextcloud 桌面客户端:把同步交给它,你只管改文件
如何将 HTML 转成 Word 文档且格式不丢失?html-to-docx 使用教程
Anki 批量操作卡片完整指南:一次搞定上千张,不再逐张修改

本月精选

如何用DamaiHelper实现演唱会门票的智能自动化抢购:完整技术解决方案指南
第4篇:59 倍性能差距的索引瓶颈定位——一次教科书级的全表扫描调优
终极歌词批量下载神器:5分钟解决离线音乐库歌词同步难题

python基础语法学习: 装饰器

发布时间:2026/8/27 11:24:23
python基础语法学习: 装饰器 文章目录装饰器装饰器的一般写法 (闭包写法)装饰器的语法糖写法装饰器带参数装饰器之原函数带返回值一个函数可以被多个装饰器装饰通用装饰器的写法:装饰器装饰器本质上是一种闭包, 其功能就是在不破坏目标函数原有的代码和功能的前提下,为目标函数增加新功能.函数拥有一下特点:函数可以作为参数进行传递函数可以作为返回值进行返回函数名称可以当成变量一样进行赋值操作现在有一个 sleep 函数defsleep():importrandomimporttimeprint(sleeping)time.sleep(random.randint(1,5))现在希望给 sleep 函数增加一个新功能:在调用 sleep 前输出:I will sleep在调用 sleep 后输出:I wake有下面的代码:print(I will sleep)sleep()print(I wake)但是这样的方式非常的不优雅,那有没有其他方式呢, 有的, 可以使用 装饰器来实现装饰器的一般写法 (闭包写法)defsleep():importrandomimporttimeprint(sleeping)time.sleep(random.randint(1,5))defouter(func):definner():print(I will sleep)func()print(I wake)returninner fnouter(sleep)fn()装饰器的语法糖写法defouter(func):definner():print(I will sleep)func()print(I wake)returninnerouterdefsleep():importrandomimporttimeprint(sleeping ...)time.sleep(random.randint(1,5))sleep()使用outer, 定义在目标函数之上这种写法与装饰器的一般写法的调用方式以一样的, 这里调用sleep(), 本质上调用的还是inner()装饰器带参数先给出无参形式的代码defouter(func):definner():print(start)func()print(end)returninnerouterdefsleep(time):print(sleeping)sleep()现在要给上述的sleep函数添加一个参数defsleep(time):print(fsleeping, time:{time})那么再按照原来的方式调用就会报错defouter(func):definner():print(start)func()print(end)returninnerouterdefsleep(time):print(fsleeping, time:{time})sleep(45)上述代码中outer等价于sleep outer(sleep), 实际上就是调用inner()当outer装饰sleep函数时outer(sleep)返回的是inner函数而inner没有参数导致调用sleep()时无法传递time参数。解决方法: 在inner函数中添加*args, **kwargs来接收任意参数并传递给funcdefouter(func):definner(*args,**kwargs):print(start)func(*args,**kwargs)print(end)returninnerouterdefsleep(time):print(fsleeping, time:{time})sleep(32)输出:start sleeping,time:32end装饰器之原函数带返回值下面要演示原函数带返回值下面函数返回值并且要打印返回值defsleep(time):print(fsleeping, time:{time})returnwakeprint(sleep(1))# wake那么现在要给这个函数添加一个装饰器只需要在装饰器内部用一个变量接收返回值并且内部的inner()返回这个返回值即可defouter(func):definner(*args,**kwargs):print(start)retfunc(*args,**kwargs)print(end)returnretreturninnerouterdefsleep(time):print(fsleeping, time:{time})returnwakeprint(sleep(1))一个函数可以被多个装饰器装饰defwrapper1(func):definner(*args,**kwargs):print(in wrapper1)func(*args,**kwargs)print(out wrapper1)returninnerdefwrapper2(func):definner(*args,**kwargs):print(in wrapper2)func(*args,**kwargs)print(out wrapper2)returninnerwrapper1wrapper2deftarget():print(in target)target()打印:inwrapper1inwrapper2intarget out wrapper2 out wrapper1装饰器的执行顺序是从下往上wrapper1wrapper2deftarget():print(in target)等价于target wrapper1(wrapper2(target))执行步骤装饰阶段定义时wrapper2先执行target wrapper2(target)→target变成wrapper2的innerwrapper1后执行target wrapper1(已装饰的target)→target变成wrapper1的inner调用阶段target()时wrapper1.inner() 开始 ├── 打印 in wrapper1 ├── 调用 func() → 这个 func 是 wrapper2.inner() │ ├── 打印 in wrapper2 │ ├── 调用 func() → 这个 func 是原始的 target() │ │ └── 打印 in target │ └── 打印 out wrapper2 └── 打印 out wrapper1通用装饰器的写法:defwrapper(fn):defwrapper(*args,**kwargs):# 目标函数执行之前 ...retfn(*args,**kwargs)# 目标函数执行之后 ...returnretreturnwrapper# 不加()wrapperdeftarget(*args,**kwargs):pass这里添加装饰器之后再调用目标函数target(), 实际上就是调用inner()

关于恒美微站

恒美微站专注于为个体商户、工作室提供极简自助建站服务,让每个人都能轻松拥有专业网站。

快速链接

  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心

服务项目

  • 可视化建站
  • 拖拽编辑
  • 主题定制
  • SEO 优化
  • 网站托管

联系方式

  • 📍 地址:北京市朝阳区建国路 88 号
  • 📞 电话:400-888-8888
  • ✉️ 邮箱:info@hmyw.cn
  • 🕐 时间:周一至周日 9:00-18:00

© 2024 恒美微站 hmyw.cn 版权所有 | 京 ICP 备 12345678 号