Python装饰器:给函数加个“Buff”

简介: Python装饰器:给函数加个“Buff”

Python装饰器:给函数加个“Buff”

Python中有个强大的功能叫装饰器,它就像游戏里的装备栏,能给函数附加额外能力而不改变函数本身。今天我们就来揭开这个“魔法”工具的神秘面纱。

什么是装饰器?

装饰器本质上是个函数,它接收一个函数作为参数,然后返回一个新函数。这种设计模式遵循了“开放封闭原则”——对扩展开放,对修改封闭。

从简单示例开始

def timer(func):
    def wrapper(*args, **kwargs):
        import time
        start = time.time()
        result = func(*args, **kwargs)
        end = time.time()
        print(f"{func.__name__} 执行耗时: {end - start:.2f}秒")
        return result
    return wrapper

@timer
def heavy_calculation():
    # 模拟耗时操作
    import time
    time.sleep(1)
    return "计算完成"

# 调用函数时会自动计时
result = heavy_calculation()

上面的@timer就是一个装饰器,它给函数添加了计时功能,而原函数不需要任何修改。

装饰器的妙用

除了性能监控,装饰器还能用于:

  • 权限验证
  • 日志记录
  • 缓存机制
  • 输入验证
  • 重试机制

带参数的装饰器

def retry(max_attempts=3):
    def decorator(func):
        def wrapper(*args, **kwargs):
            for attempt in range(max_attempts):
                try:
                    return func(*args, **kwargs)
                except Exception as e:
                    if attempt == max_attempts - 1:
                        raise e
                    print(f"第{attempt + 1}次尝试失败,正在重试...")
            return wrapper
        return decorator

@retry(max_attempts=5)
def unstable_api_call():
    # 可能失败的操作
    pass

结语

装饰器让代码更干净、更模块化。下次当你发现多个函数需要相同的前置或后置处理时,不妨考虑用装饰器来优化代码结构。这个小小的“语法糖”,能让你的Python代码更加优雅强大!

相关文章
|
1月前
|
大数据 Python
Python列表推导式:优雅与效率的完美结合
Python列表推导式:优雅与效率的完美结合
228 114
|
3天前
|
安全 Python
Python 3.10模式匹配:告别冗长的if-elif链条
Python 3.10引入结构模式匹配,告别冗长if-elif链。支持类型与值同时匹配、结构解构和多种模式语法,让代码更清晰安全。适用于解析器、状态机等复杂分支场景,结合dataclass效果更佳,是Python表达力的重要升级。
|
9天前
|
安全 PHP 开发者
告别混乱:用PHP 8的Match表达式优雅地简化你的条件逻辑
告别混乱:用PHP 8的Match表达式优雅地简化你的条件逻辑
157 113
|
9天前
|
Java 数据建模 编译器
告别样板代码:探索Java Record如何重塑数据载体
告别样板代码:探索Java Record如何重塑数据载体
167 114
|
9天前
|
安全 PHP
PHP 8.1枚举:告别数组常量的新时代
PHP 8.1枚举:告别数组常量的新时代
152 113
|
16天前
|
弹性计算 Prometheus Cloud Native
从CPU到RPS:HPA避坑指南,让弹性伸缩不再“空转”
从CPU到RPS:HPA避坑指南,让弹性伸缩不再“空转”
167 115
|
1月前
|
PHP C语言 开发者
告别循环!用这些PHP数组函数提升你的代码效率
告别循环!用这些PHP数组函数提升你的代码效率
238 115
|
4天前
|
API C++ Python
Python 3.10 新武器:用 match-case 优雅地替换复杂的 if-elif 链
Python 3.10 新武器:用 match-case 优雅地替换复杂的 if-elif 链
|
20天前
|
JavaScript 安全 IDE
用 TypeScript 告别“无法读取未定义属性”的噩梦
用 TypeScript 告别“无法读取未定义属性”的噩梦
158 112
|
20天前
|
JavaScript 前端开发 IDE
TypeScript:为你的JavaScript系上“安全带”
TypeScript:为你的JavaScript系上“安全带”
193 112