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

Python装饰器(Decorator)详解

Python装饰器详解

1. 装饰器是什么?

装饰器(Decorator)是Python中用于动态修改函数或类行为的工具。它本质上是一个高阶函数,接受一个函数作为参数,返回一个新的增强函数。通过@decorator语法糖,可以在不修改原函数代码的情况下扩展其功能。

2. 核心语法与原理
  • 基本语法

    @decorator_name
    def target_function():
        pass
    

    等价于:

    target_function = decorator_name(target_function)
    
  • 保留元数据
    使用functools.wraps保留原函数的名称、文档字符串等信息:

    import functools
    
    def my_decorator(func):
        @functools.wraps(func)
        def wrapper(*args, **kwargs):
            # 增强逻辑
            return func(*args, **kwargs)
        return wrapper
    
3. 常见使用场景

装饰器广泛应用于以下场景:

场景作用示例代码
日志记录记录函数输入输出及执行细节python def log_decorator(func): ... logging.info(f"Call {func.__name__}")
性能分析测量函数执行时间python def timer(func): ... print(f"Time: {time.time()-start}")
权限验证检查用户权限python def auth_required(func): ... if not user.is_admin: raise Error
缓存结果存储函数结果避免重复计算python def memoize(func): ... cache[args] = func(*args)
输入验证确保参数合法性python def validate_input(func): ... if not isinstance(x, int): raise
重试机制自动重试失败操作python def retry(func): ... for _ in range(3): try: return func()
4. 高级用法
  • 带参数的装饰器
    通过嵌套函数实现参数传递:

    def repeat(n):
        def decorator(func):
            def wrapper(*args, **kwargs):
                for _ in range(n):
                    result = func(*args, **kwargs)
                return result
            return wrapper
        return decorator
    
    @repeat(3)
    def greet(name):
        print(f"Hello {name}")
    
  • 类装饰器
    定义__call__方法修改类行为:

    class LogDecorator:
        def __init__(self, func):
            self.func = func
        def __call__(self, *args, **kwargs):
            print(f"Call {self.func.__name__}")
            return self.func(*args, **kwargs)
    
    @LogDecorator
    def my_function():
        pass
    
  • 装饰器链
    组合多个装饰器,按从内到外顺序执行:

    @decorator1
    @decorator2
    def my_func():
        pass
    
5. 实际应用示例

场景:优化斐波那契数列计算

import functools
import time

# 日志装饰器
def log_decorator(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        print(f"Call {func.__name__} with args {args}")
        result = func(*args, **kwargs)
        print(f"{func.__name__} returned {result}")
        return result
    return wrapper

# 计时装饰器
def timer(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        start = time.time()
        result = func(*args, **kwargs)
        print(f"{func.__name__} took {time.time()-start:.4f}s")
        return result
    return wrapper

# 缓存装饰器
def memoize(func):
    cache = {}
    @functools.wraps(func)
    def wrapper(*args):
        if args not in cache:
            cache[args] = func(*args)
        return cache[args]
    return wrapper

# 应用装饰器
@log_decorator
@timer
@memoize
def fibonacci(n):
    if n <= 1:
        return n
    return fibonacci(n-1) + fibonacci(n-2)

print(fibonacci(30))  # 输出结果并显示执行时间
6. 总结

装饰器是Python中提升代码复用性和可维护性的重要工具。通过动态增强函数行为,它适用于日志记录、性能监控、权限控制等多种场景。合理使用装饰器能使代码更简洁优雅,同时避免重复代码。

相关文章:

  • 【c】-include经典注入问题
  • Python学习笔记(二)(字符串)
  • 有哪些反爬机制可能会影响Python爬取视频?如何应对这些机制?
  • C#结合SQLite数据库使用方法
  • Dynamics365 ExportPdfTemplateExportWordTemplate两个Action调用的body构造
  • CASAIM自动化智能检测系统在螺杆转子数字化检测应用
  • 使用 Datadog 和 Slack Alerts 监控 minikube
  • Linux安装Elasticsearch详细教程
  • 乳腺癌识别:双模型融合
  • 行销和随销的区别
  • 深入理解 WebMvcConfigurer:定制 Spring MVC 的核心接口
  • AI与深度伪造技术:如何识别和防范AI生成的假视频和假音频?
  • CentOS 系统磁盘扩容并挂载到根目录(/)的详细步骤
  • 24FIC
  • 【数学建模】(智能优化算法)天牛须算法(Beetle Antennae Search, BAS)详解与Python实现
  • 利用 RNN 预测股票价格:从数据处理到可视化实战
  • 人工智能之数学基础:复矩阵
  • 机器人零位标定修正流程介绍
  • ZFS 数据恢复:从误删修复到 RAIDZ 恢复,原生工具与第三方软件对比
  • 【图像处理】:opencv实现模糊图像处理和对比度增强
  • 淘宝网为什么是c2c模式/超云seo优化
  • 建设和住房委员会官方网站/百度知道网页版
  • 网络营销的主要形式有建设网站/天津搜索引擎优化
  • 怎么查看wordpress版本号/在线seo短视频
  • 网站建设平台代理/seo详细教程
  • 免费网络服务器/优化推广网站seo