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

Python装饰器(Decorators)深度解析

Python装饰器(Decorators)深度解析

作为一名从后端开发转向Rust的开发者,我发现Python的装饰器与Rust的特质(Traits)有一些相似之处,它们都可以用于扩展代码的功能。今天我想分享一下我对Python装饰器的理解和实践。

什么是装饰器?

装饰器是一种特殊的函数,它可以修改其他函数或类的行为。装饰器的语法使用@符号,放在被装饰函数或类的定义之前。

@decorator def function(): pass

这相当于:

def function(): pass function = decorator(function)

装饰器的基本实现

1. 简单装饰器

def simple_decorator(func): def wrapper(): print("Before function execution") func() print("After function execution") return wrapper @simple_decorator def hello(): print("Hello, world!") # 调用函数 hello()

输出:

Before function execution Hello, world! After function execution

2. 带参数的装饰器

def decorator_with_args(prefix): def decorator(func): def wrapper(): print(f"{prefix}: Before function execution") func() print(f"{prefix}: After function execution") return wrapper return decorator @decorator_with_args("LOG") def hello(): print("Hello, world!") # 调用函数 hello()

输出:

LOG: Before function execution Hello, world! LOG: After function execution

3. 保留函数元数据的装饰器

import functools def decorator_with_metadata(func): @functools.wraps(func) def wrapper(): print("Before function execution") func() print("After function execution") return wrapper @decorator_with_metadata def hello(): """Print hello message""" print("Hello, world!") # 调用函数 hello() # 查看函数元数据 print(f"Function name: {hello.__name__}") print(f"Function docstring: {hello.__doc__}")

输出:

Before function execution Hello, world! After function execution Function name: hello Function docstring: Print hello message

4. 带参数的函数装饰器

import functools def decorator_with_args_and_function_args(func): @functools.wraps(func) def wrapper(*args, **kwargs): print("Before function execution") result = func(*args, **kwargs) print("After function execution") return result return wrapper @decorator_with_args_and_function_args def add(a, b): """Add two numbers""" return a + b # 调用函数 result = add(1, 2) print(f"Result: {result}") # 查看函数元数据 print(f"Function name: {add.__name__}") print(f"Function docstring: {add.__doc__}")

输出:

Before function execution After function execution Result: 3 Function name: add Function docstring: Add two numbers

装饰器的高级用法

1. 类装饰器

class ClassDecorator: def __init__(self, func): self.func = func def __call__(self, *args, **kwargs): print("Before function execution") result = self.func(*args, **kwargs) print("After function execution") return result @ClassDecorator def hello(): print("Hello, world!") # 调用函数 hello()

输出:

Before function execution Hello, world! After function execution

2. 带参数的类装饰器

class ClassDecoratorWithArgs: def __init__(self, prefix): self.prefix = prefix def __call__(self, func): def wrapper(*args, **kwargs): print(f"{self.prefix}: Before function execution") result = func(*args, **kwargs) print(f"{self.prefix}: After function execution") return result return wrapper @ClassDecoratorWithArgs("LOG") def hello(): print("Hello, world!") # 调用函数 hello()

输出:

LOG: Before function execution Hello, world! LOG: After function execution

3. 装饰器链

import functools def decorator1(func): @functools.wraps(func) def wrapper(*args, **kwargs): print("Decorator 1: Before function execution") result = func(*args, **kwargs) print("Decorator 1: After function execution") return result return wrapper def decorator2(func): @functools.wraps(func) def wrapper(*args, **kwargs): print("Decorator 2: Before function execution") result = func(*args, **kwargs) print("Decorator 2: After function execution") return result return wrapper @decorator1 @decorator2 def hello(): print("Hello, world!") # 调用函数 hello()

输出:

Decorator 1: Before function execution Decorator 2: Before function execution Hello, world! Decorator 2: After function execution Decorator 1: After function execution

4. 装饰器用于类方法

import functools def method_decorator(func): @functools.wraps(func) def wrapper(self, *args, **kwargs): print("Before method execution") result = func(self, *args, **kwargs) print("After method execution") return result return wrapper class MyClass: @method_decorator def hello(self): print("Hello, world!") # 创建实例并调用方法 obj = MyClass() obj.hello()

输出:

Before method execution Hello, world! After method execution

装饰器的应用场景

1. 日志记录

import functools import time def log_execution(func): @functools.wraps(func) def wrapper(*args, **kwargs): start_time = time.time() print(f"Executing {func.__name__}...") result = func(*args, **kwargs) end_time = time.time() print(f"{func.__name__} executed in {end_time - start_time:.4f} seconds") return result return wrapper
http://www.jsqmd.com/news/637548/

相关文章:

  • vLLM-v0.17.1惊艳效果:AWQ量化后Llama3-8B显存占用降至11GB
  • 交期延误?轻流 AI 无代码给出新解法
  • 终极ZCF多语言支持指南:一键实现中英文双语配置与无缝国际化体验
  • 【零成本降AI】别盲目改论文!基于知网报告的DeepSeek降AI实操(附神级提示词)
  • 2025届毕业生推荐的AI科研方案推荐
  • KubeBlocks SQL Server(MSSQL) Kubernetes Operator 高可用实现
  • 终极指南:Microsoft BASIC M6502 字符串处理技术解析
  • (7)Windows Linux 操作系统分区管理、LVM逻辑卷管理
  • 终极指南:Google Cloud Go 客户端库的版本管理与向后兼容策略
  • 终极指南:如何快速构建现代化XMPP网页聊天客户端
  • 企业级Multi-Agent系统架构设计:微服务化与模块解耦最佳实践
  • 终极Flask-SQLAlchemy快速入门:10分钟搭建你的第一个数据库应用
  • C++进阶(9)特殊类设计
  • 迎战2026最严查重:DeepSeek联动知网报告,手把手带你稳降论文AI率
  • 轻流无代码如何重构质量管理体系?这 3 个价值必须了解
  • franc项目架构深度解析:从Monorepo到模块化设计的终极指南
  • 2026届学术党必备的五大AI辅助论文方案推荐
  • Dayflow未来路线图全解析:全新仪表板与本地AI模型优化带来的生产力革命
  • 基于SWIFT与LoRA微调大模型实现连续值预测
  • 如何使用Authlogic实现强密码验证与复杂度检查:完整配置指南
  • C++进阶(10)C++的类型转换
  • 终极React Server Components Demo架构揭秘:客户端与服务端组件的完美协作指南
  • 革命性监控工具ebpf_exporter:深度解析内核性能的终极指南
  • 2026年口碑好的1688店铺托管外包/宁波1688店铺托管综合评价公司 - 品牌宣传支持者
  • 2026年知名的广东储罐大件运输优选公司推荐 - 品牌宣传支持者
  • 斯坦福首门AI开发课程:人机协作工程而非氛围编程
  • 如何快速掌握WTM多UI框架实战:LayUI、React、VUE、Blazor全解析
  • SlateDB范围查询优化技巧:实现高效数据扫描的5个关键策略
  • 终极指南:DefectDojo与其他安全工具对比,为什么它是你的最佳漏洞管理选择
  • AppleRa1n完整指南:iOS 15-16设备iCloud激活锁绕过终极方案