当前位置: 首页 > 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.jsqmd.com/news/975899/

相关文章:

  • AI 副业全景图:普通人用 AI 赚钱的 8 条真实路径
  • MSC8101嵌入式系统硬件设计:从电源、时钟到总线调试的实战指南
  • 云原生技术08-Helm 3:Kubernetes的“Yum/Apt“——包管理so easy,手把手教你写第一个Helm Chart
  • 行业优选|2026开料机、封边机、六面钻、包装线主流品牌综合解读 - 深度智识库
  • NLP工业落地实战:从BERT/GPT到可交付系统的选型与优化
  • 【Linux网络】深入理解 HTTP 协议(五):Cookie 与 Session从无状态到会话保持的底层实现
  • 2026年酒店加盟品牌差异拆解:不同品牌选型对比 - 科技焦点
  • VRChat语言交流终极指南:VRCT实时翻译与语音转文字完整教程
  • 实战MPC190加密卡驱动开发:中断、DMA与FIPS合规性详解
  • 2026 海南财税新政解读:吃透红利,合规经营避坑指南 - 资讯纵览
  • 电机控制电流检测方案全解析:从分流电阻到FOC算法实战
  • 5分钟快速上手:RookieAI_yolov8 AI自瞄终极指南
  • 从2026年6月深圳离婚纠纷判例看专业价值:何波律师揭秘房产加名后的产权份额界定与反家暴维权实务 - 十大排行榜推荐
  • 2026年小吃车厂家发展现状分析(附核心数据) - 多才菠萝
  • 从办公室网段隔离到智能家居分组:eNSP模拟VLAN的3个真实应用场景实验
  • 基于LPC55S16的USB-CAN适配器设计与实现
  • 吉林市门窗厂/系统窗哪家靠谱?北方住宅选型实用指南 - 奔跑123
  • [HTTPS/TCP]everthing共享文件夹
  • 别再死记硬背了!从‘放回抽球’到‘文本生成’,图解马尔可夫链的无记忆性
  • 3色时间标签:NewJob浏览器插件帮你一眼识别招聘职位新鲜度
  • 2026年6月山东发电机租赁优选指南:工程应急、活动保电设备租赁攻略 - 海棠依旧大
  • AI 技术写作辅助:结构化大纲与内容润色的工程实践
  • 8GB显存也能玩转AI视频生成:ComfyUI-FramePackWrapper完整指南
  • 简单三步搞定NCM音乐解密:ncmppGui极速转换工具完整使用指南
  • RFID读写器 买不对=后期天天救火:港傲物联(上海)的固定式/手持式/UHF全形态读写器体系,把能读到升级为稳定读到 - 资讯纵览
  • 如何快速配置风扇控制:Windows平台终极风扇控制软件FanControl完全指南
  • 明日方舟素材资源库:一站式获取游戏美术资源的完整指南
  • Linux所遇问题自记录
  • 深入解析MCPWM TPU:中心对齐、死区时间与同步更新实战指南
  • 2026云南省哪些大学毕业后好就业?看这几点就够了 - 品牌2026