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

Python装饰器进阶:让函数功能无限扩展的魔法

Python装饰器进阶:让函数功能无限扩展的魔法

装饰器是Python中一种强大的工具,允许在不修改函数源代码的情况下扩展其功能。通过装饰器,可以实现日志记录、性能测试、权限校验等功能。

装饰器的基本概念

装饰器本质上是一个接受函数作为参数并返回新函数的高阶函数。基本结构如下:

def decorator(func): def wrapper(*args, **kwargs): # 扩展功能代码 result = func(*args, **kwargs) # 扩展功能代码 return result return wrapper
带参数的装饰器

装饰器本身也可以接受参数,这种设计允许更灵活地控制装饰行为:

def repeat(num_times): def decorator(func): def wrapper(*args, **kwargs): for _ in range(num_times): result = func(*args, **kwargs) return result return wrapper return decorator @repeat(num_times=3) def greet(name): print(f"Hello {name}")
类装饰器

通过实现__call__方法,类也可以作为装饰器使用:

class CountCalls: def __init__(self, func): self.func = func self.num_calls = 0 def __call__(self, *args, **kwargs): self.num_calls += 1 print(f"Call {self.num_calls} of {self.func.__name__}") return self.func(*args, **kwargs) @CountCalls def say_hello(): print("Hello")
多个装饰器叠加

多个装饰器可以叠加使用,执行顺序是从下往上:

def decorator1(func): def wrapper(): print("Decorator 1") func() return wrapper def decorator2(func): def wrapper(): print("Decorator 2") func() return wrapper @decorator1 @decorator2 def my_function(): print("Original function")
保留函数元信息

使用装饰器时,原始函数的__name__等元信息会被覆盖,可以使用functools.wraps保留:

from functools import wraps def debug(func): @wraps(func) def wrapper(*args, **kwargs): print(f"Calling {func.__name__}") return func(*args, **kwargs) return wrapper
装饰器的高级应用

装饰器可以用于缓存计算结果、验证权限、记录日志等场景:

import time from functools import lru_cache def timing(func): @wraps(func) def wrapper(*args, **kwargs): start = time.time() result = func(*args, **kwargs) end = time.time() print(f"{func.__name__} took {end-start:.2f} seconds") return result return wrapper @lru_cache(maxsize=None) @timing def fibonacci(n): if n < 2: return n return fibonacci(n-1) + fibonacci(n-2)

通过灵活运用装饰器,可以极大地提高代码的可重用性和可维护性,同时保持代码的简洁性。

github.com/otikukete/9m0/issues/129
github.com/otikukete/9m0/issues/128
github.com/otikukete/9m0/issues/127
github.com/otikukete/9m0/issues/126
github.com/otikukete/9m0/issues/125
github.com/otikukete/9m0/issues/124
github.com/otikukete/9m0/issues/123
github.com/otikukete/9m0/issues/122
github.com/otikukete/9m0/issues/121
github.com/otikukete/9m0/issues/120
github.com/otikukete/9m0/issues/119
github.com/otikukete/9m0/issues/118
github.com/otikukete/9m0/issues/117
github.com/otikukete/9m0/issues/116
github.com/otikukete/9m0/issues/115
github.com/otikukete/9m0/issues/114
github.com/otikukete/9m0/issues/113
github.com/otikukete/9m0/issues/112
github.com/otikukete/9m0/issues/111
github.com/otikukete/9m0/issues/110
github.com/otikukete/9m0/issues/109
github.com/otikukete/9m0/issues/108
github.com/somahode/ljl/issues/118
github.com/otikukete/9m0/issues/107
github.com/somahode/ljl/issues/117
github.com/otikukete/9m0/issues/106
github.com/somahode/ljl/issues/116
github.com/otikukete/9m0/issues/105
github.com/somahode/ljl/issues/115
github.com/otikukete/9m0/issues/104
github.com/somahode/ljl/issues/114
github.com/otikukete/9m0/issues/103
github.com/somahode/ljl/issues/113
github.com/otikukete/9m0/issues/102
github.com/somahode/ljl/issues/112
github.com/otikukete/9m0/issues/101
github.com/somahode/ljl/issues/111
github.com/otikukete/9m0/issues/100
github.com/somahode/ljl/issues/110
github.com/otikukete/9m0/issues/99
github.com/somahode/ljl/issues/109
github.com/otikukete/9m0/issues/98
github.com/somahode/ljl/issues/108
github.com/otikukete/9m0/issues/97
github.com/somahode/ljl/issues/107
github.com/otikukete/9m0/issues/96
github.com/somahode/ljl/issues/106
github.com/otikukete/9m0/issues/95
github.com/somahode/ljl/issues/105
github.com/otikukete/9m0/issues/94
github.com/otikukete/9m0/issues/93
github.com/somahode/ljl/issues/104
github.com/otikukete/9m0/issues/92
github.com/somahode/ljl/issues/103
github.com/otikukete/9m0/issues/91
github.com/somahode/ljl/issues/102
github.com/otikukete/9m0/issues/90
github.com/somahode/ljl/issues/101
github.com/otikukete/9m0/issues/89
github.com/somahode/ljl/issues/100
github.com/otikukete/9m0/issues/88
github.com/somahode/ljl/issues/99
github.com/otikukete/9m0/issues/87
github.com/somahode/ljl/issues/98
github.com/otikukete/9m0/issues/86
github.com/somahode/ljl/issues/97
github.com/otikukete/9m0/issues/85
github.com/somahode/ljl/issues/96
github.com/otikukete/9m0/issues/84
github.com/somahode/ljl/issues/95
github.com/otikukete/9m0/issues/83
github.com/somahode/ljl/issues/94
github.com/otikukete/9m0/issues/82
github.com/somahode/ljl/issues/93
github.com/otikukete/9m0/issues/81
github.com/somahode/ljl/issues/92
github.com/tzl2013/ro7/issues/90
github.com/otikukete/9m0/issues/80
github.com/somahode/ljl/issues/91
github.com/tzl2013/ro7/issues/89
github.com/otikukete/9m0/issues/79
github.com/somahode/ljl/issues/90
github.com/tzl2013/ro7/issues/88
github.com/otikukete/9m0/issues/78
github.com/tzl2013/ro7/issues/87
github.com/somahode/ljl/issues/89

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

相关文章:

  • 3个颠覆性技巧:用手柄打造你的跨平台B站娱乐中心
  • Onekey Steam Depot清单下载工具:技术原理与实战指南
  • 从零部署GICI-LIB:一站式搞定GNSS/INS/Camera融合导航开发环境
  • 如何用WindowResizer实现Windows窗口尺寸的终极自由控制
  • 企业级RAG必看:为什么说单纯依赖SPLADE稀疏向量可能是个陷阱?
  • 智慧树自动刷课插件:告别手动刷课的终极解决方案
  • 2026废气处理设备厂家推荐 常州天环VS天得一(产能+专利+服务三维度对比) - 爱采购寻源宝典
  • 2025年国内大模型API免费额度对比:哪个平台最适合你的项目?
  • 百考通AI:攻克毕业论文三大难关,智能工具如何重塑学术写作流程
  • 别再死记硬背Dijkstra了!用‘紧密度中心性’实战理解图算法的核心思想
  • ABAP BAPI_PO_CREATE1实战:如何绕过信息记录直接设置PO净价(附代码示例)
  • 3分钟解决Mac滚动混乱:Scroll Reverser让每个设备都按你的习惯工作
  • FreeRTOS中prvStartFirstTask()触发HardFault的NVIC优先级冲突解析
  • 专业级ModBus主站工具:QModMaster的工业通信架构深度解析
  • AI破局毕业季:百考通AI如何革新你的学术写作与科研流程
  • 给机器人“瘦身”:基于埃夫特ER3B-C60的轻量化改造与二次开发入门
  • 甲骨文创始人拉里·埃里森的5个疯狂商业决策:从2000美元到千亿帝国的秘密
  • 春联生成模型-中文-base:达摩院AI对联生成器使用指南
  • 终极指南:在Obsidian中轻松管理Excel表格的完整解决方案
  • 3分钟搞定抖音批量下载:从零开始的高效内容采集实战指南
  • SpringBoot集成Guacamole:构建无插件浏览器远程桌面网关
  • 告别手动计算!STM32CubeMX HAL库配置高级定时器互补PWM的保姆级指南(STM32F103ZET6)
  • 微信聊天记录完整备份教程:WechatBakTool终极指南
  • DriverStore Explorer:Windows驱动清理终极指南,快速释放磁盘空间
  • 美伊:如何与互不信任的对手谈判?
  • 5分钟掌握手机号查QQ号:开发者的逆向工程实战指南
  • Nomic-Embed-Text-V2-MoE 在CSDN社区的应用:智能问答匹配与内容推荐
  • 2026成套开关柜厂家推荐排行榜产能、专利、质量三维度权威解析 - 爱采购寻源宝典
  • Qwen3.5-2B多场景落地:跨境电商独立站AI导购——图片询价+多语种应答
  • Windows 11 时间穿越实验:当系统时钟突破万年大关的崩溃实录