Python中的装饰器:优雅地增强函数功能

简介: Python中的装饰器:优雅地增强函数功能

Python中的装饰器:优雅地增强函数功能

装饰器是Python中一个强大且灵活的特性,它允许我们在不修改原始函数代码的情况下,为函数添加额外的功能。本文将深入探讨装饰器的工作原理、实现方法以及实际应用场景。

什么是装饰器?

装饰器本质上是一个高阶函数,它接受一个函数作为参数,并返回一个新的函数。使用装饰器可以在运行时修改或增强函数的行为,而不需要改变函数本身的代码。

def simple_decorator(func):
    def wrapper():
        print("函数执行前")
        func()
        print("函数执行后")
    return wrapper

@simple_decorator
def say_hello():
    print("Hello!")

say_hello()

输出:

函数执行前
Hello!
函数执行后

装饰器的实际应用

1. 性能分析装饰器

import time
from functools import wraps

def timer(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print(f"{func.__name__} 执行时间: {end_time - start_time:.4f}秒")
        return result
    return wrapper

@timer
def slow_function():
    time.sleep(2)
    return "完成"

result = slow_function()
print(result)

2. 缓存装饰器

from functools import lru_cache

@lru_cache(maxsize=128)
def fibonacci(n):
    if n < 2:
        return n
    return fibonacci(n-1) + fibonacci(n-2)

# 第一次计算会执行递归
print(fibonacci(10))

# 第二次计算会直接从缓存中获取结果
print(fibonacci(10))

3. 权限验证装饰器

def requires_auth(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        if not current_user.is_authenticated:
            raise PermissionError("需要登录")
        return func(*args, **kwargs)
    return wrapper

@requires_auth
def sensitive_operation():
    return "敏感操作执行成功"

带参数的装饰器

有时候我们需要装饰器本身也能接受参数,这就需要再嵌套一层函数:

def repeat(num_times):
    def decorator_repeat(func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            for _ in range(num_times):
                result = func(*args, **kwargs)
            return result
        return wrapper
    return decorator_repeat

@repeat(num_times=3)
def greet(name):
    print(f"Hello {name}")

greet("World")

类装饰器

除了函数装饰器,Python还支持类装饰器:

class CountCalls:
    def __init__(self, func):
        self.func = func
        self.num_calls = 0

    def __call__(self, *args, **kwargs):
        self.num_calls += 1
        print(f"调用次数: {self.num_calls}")
        return self.func(*args, **kwargs)

@CountCalls
def say_hello():
    print("Hello!")

say_hello()
say_hello()

装饰器的最佳实践

  1. 使用functools.wraps:保持原始函数的元信息(如函数名、文档字符串等)
  2. 避免副作用:装饰器应该透明地增强函数,而不是改变其核心行为
  3. 考虑可读性:复杂的装饰器可能会降低代码的可读性

总结

装饰器是Python中一个非常强大的特性,它提供了一种清晰、可重用的方式来修改或增强函数的行为。通过合理使用装饰器,我们可以实现横切关注点的分离,使代码更加模块化和可维护。

掌握装饰器不仅能让你的代码更加Pythonic,还能为你打开函数式编程的大门。希望本文能帮助你更好地理解和应用Python装饰器!

进一步学习建议

  • 深入了解闭包和函数作用域
  • 探索Python标准库中的装饰器(如@staticmethod, @classmethod)
  • 尝试实现更复杂的装饰器模式

Happy coding! 🐍

相关文章
|
6天前
|
人工智能 运维 安全
|
4天前
|
人工智能 异构计算
敬请锁定《C位面对面》,洞察通用计算如何在AI时代持续赋能企业创新,助力业务发展!
敬请锁定《C位面对面》,洞察通用计算如何在AI时代持续赋能企业创新,助力业务发展!
|
5天前
|
机器学习/深度学习 人工智能 自然语言处理
B站开源IndexTTS2,用极致表现力颠覆听觉体验
在语音合成技术不断演进的背景下,早期版本的IndexTTS虽然在多场景应用中展现出良好的表现,但在情感表达的细腻度与时长控制的精准性方面仍存在提升空间。为了解决这些问题,并进一步推动零样本语音合成在实际场景中的落地能力,B站语音团队对模型架构与训练策略进行了深度优化,推出了全新一代语音合成模型——IndexTTS2 。
558 17
|
11天前
|
人工智能 JavaScript 测试技术
Qwen3-Coder入门教程|10分钟搞定安装配置
Qwen3-Coder 挑战赛简介:无论你是编程小白还是办公达人,都能通过本教程快速上手 Qwen-Code CLI,利用 AI 轻松实现代码编写、文档处理等任务。内容涵盖 API 配置、CLI 安装及多种实用案例,助你提升效率,体验智能编码的乐趣。
910 109
|
5天前
|
人工智能 测试技术 API
智能体(AI Agent)搭建全攻略:从概念到实践的终极指南
在人工智能浪潮中,智能体(AI Agent)正成为变革性技术。它们具备自主决策、环境感知、任务执行等能力,广泛应用于日常任务与商业流程。本文详解智能体概念、架构及七步搭建指南,助你打造专属智能体,迎接智能自动化新时代。