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

Python全栈修炼之路 | 第14篇 :装饰器 —— Python最优雅的语法糖

本文是《Python全栈修炼之路》系列的第14篇,属于进阶修炼篇前半部分。适合已掌握Python基础语法,希望深入理解Python核心机制的读者。


前言

装饰器(Decorator)是Python中最具特色的语法特性之一,它允许我们在不修改原函数代码的前提下,为函数添加额外的功能。从日志记录、性能计时到权限校验、缓存优化,装饰器无处不在。

本文将从闭包概念出发,逐步深入装饰器的各种形态,揭示其底层原理,并通过实战项目展示装饰器的强大威力。


一、知识点讲解

1.1 闭包(Closure)—— 装饰器的基石

在理解装饰器之前,必须先掌握闭包的概念。闭包是指引用了外部作用域变量的函数,即使外部函数已经执行完毕,闭包仍然可以访问这些变量。

defouter_function(x):"""外部函数"""definner_function(y):"""内部函数(闭包)"""returnx+y# 引用了外部函数的变量xreturninner_function# 创建闭包closure=outer_function(10)print(closure(5))# 15print(closure(20))# 30# 查看闭包引用的外部变量print(closure.__closure__)# (<cell at ...>,)print(closure.__closure__[0].cell_contents)# 10

闭包的核心要素:

要素说明
嵌套函数函数内部定义另一个函数
外部变量引用内部函数引用外部函数的变量
返回内部函数外部函数返回内部函数(不是调用)
# 更实用的闭包示例:计数器defmake_counter():count=0defcounter():nonlocalcount# 声明使用外部非全局变量count+=1returncountreturncounter counter_a=make_counter()counter_b=make_counter()print(counter_a())# 1print(counter_a())# 2print(counter_b())# 1(独立的计数器)

1.2 函数装饰器基础

装饰器本质上是一个接收函数作为参数并返回函数的高阶函数

# 最简单的装饰器defmy_decorator(func):defwrapper():print("函数执行前")func()print("函数执行后")returnwrapperdefsay_hello():print("Hello!")# 手动应用装饰器say_hello=my_decorator(say_hello)say_hello()# 输出:# 函数执行前# Hello!# 函数执行后

使用@语法糖:

@my_decoratordefsay_hello():print("Hello!")# 等价于:say_hello = my_decorator(say_hello)

带参数的被装饰函数:

defmy_decorator(func):defwrapper(*args,**kwargs):# 接收任意参数print(f"调用函数:{func.__name__}")print(f"位置参数:{args}")print(f"关键字参数:{kwargs}")result=func(*args,**kwargs)print(f"返回值:{result}")returnresultreturnwrapper@my_decoratordefadd(a,b,c=0):returna+b+c add(1,2,c=3)# 输出:# 调用函数: add# 位置参数: (1, 2)# 关键字参数: {'c': 3}# 返回值: 6

1.3 带参数的装饰器

有时装饰器本身也需要参数,这时需要三层嵌套

defrepeat(num_times):"""接收参数的装饰器工厂"""defdecorator(func):defwrapper(*args,**kwargs):for_inrange(num_times):result=func(*args,**kwargs)returnresultreturnwrapperreturndecorator@repeat(num_times=3)defgreet(name):print(f"Hello,{name}!")greet("Alice")# 输出3次: Hello, Alice!

执行顺序解析:

@repeat(num_times=3)defgreet(name):pass# 等价于:# decorator = repeat(num_times=3) # 先执行,返回装饰器# greet = decorator(greet) # 再执行装饰

1.4 类装饰器

除了函数,类也可以作为装饰器。类装饰器通过__call__方法实现。

classCountCalls:"""统计函数被调用次数的装饰器类"""def__init__(self,func):self.func=func self.count=0def__call__(self,*args,**kwargs):self.count+=1print(f"{self.func.__name__}被调用了{self.count}次")returnself.func(*args,**kwargs)@CountCallsdef
http://www.gsyq.cn/news/1487613.html

相关文章:

  • 2026 海南财税新政解读:吃透红利,合规经营避坑指南 - 资讯纵览
  • 从办公室网段隔离到智能家居分组:eNSP模拟VLAN的3个真实应用场景实验
  • 简单三步搞定NCM音乐解密:ncmppGui极速转换工具完整使用指南
  • 如何快速配置风扇控制:Windows平台终极风扇控制软件FanControl完全指南
  • 嵌入式电能计量算法:从功率计算到能量累积的工程实现
  • Ultimate Vocal Remover GUI:零门槛掌握AI音频分离的3大实战技巧
  • 上交大突破:多米诺推理策略实现AI推理速度近6倍能力提升
  • 2026在线答题小程序开发工具有哪些?哪个值得使用
  • 2026 年内蒙古正规旅行社权威评测 - 互联网科技品牌测评
  • 基于NXP EdgeLock A5000的硬件级设备认证:从PKI原理到嵌入式安全实践
  • 三国30位核心人物结构化关系数据(JSON+关系图,开箱即用)
  • 杭州劳力士手表回收 收的顶作为行业标杆实力出圈 - 奢侈品回收评测
  • 基于YOLOv8的智能瞄准系统:5步构建高性能AI游戏辅助
  • 2026年AI营销赛道深度测评:六大主流服务商实力盘点,助力企业精准选型 - 资讯焦点
  • 2026年最新依索维尔玻璃棉合规厂家排行及选型指南 - 奔跑123
  • 腾讯元宝 pdf 办公导出痛点全梳理,借助 AI 导出鸭实测多款导出工具,挑选性价比最优的文档转换办法
  • 本周 GitHub 热门项目推荐:Headroom 和 CC Switch
  • VS2019一键运行的OpenGL 3D交互示例:左键自由旋转+右键XY平移
  • 从无人机照片到三维地图:OpenDroneMap(ODM)完全使用指南
  • 国内塑料板材主流生产企业实测排行盘点 - 奔跑123
  • Pandas 高级技巧与最佳实践
  • 执笔赴盛夏,逐梦向长空|沈阳昊天环宇无人机致全体高考学子
  • 为什么说ArduPilot是开源自动驾驶系统的终极解决方案?
  • 5B参数如何实现720P视频生成?深度解析Wan2.2-TI2V-5B的技术突破与实践应用
  • 从STP到RSTP:一次配置搞定思科交换机多VLAN的根桥选举(附优先级设置避坑指南)
  • SQLite图形化工具选哪个?深度对比SQLite Expert与DB Browser的优缺点和适用场景
  • 百度自然排名靠后怎么用GEO优化补救
  • 解决Windows 10/11运行《红色警戒2》的5大核心痛点:原生版配置深坑与一键集成优化版的深度横向测评
  • 英国2026留学中介哪家好?八家优选全面盘点口碑王者 - 资讯纵览
  • 2026风幕柜水果展示柜敞开式保鲜源头工厂入选实力品牌 - 资讯焦点