Python中的装饰器
字数 531 2025-11-02 17:10:18

Python中的装饰器

描述
装饰器是Python中一种强大的语法特性,允许在不修改原函数代码的情况下,动态地增强函数的功能。它本质上是一个高阶函数,接受一个函数作为参数,并返回一个新的函数。装饰器常用于日志记录、性能测试、权限校验等场景。

解题过程

  1. 基础概念:函数作为对象
    在Python中,函数是一等对象,意味着函数可以像变量一样被传递、赋值或作为其他函数的参数/返回值。例如:

    def greet(name):
        return f"Hello, {name}!"
    
    # 将函数赋值给变量
    my_func = greet
    print(my_func("Alice"))  # 输出:Hello, Alice!
    
  2. 高阶函数:函数作为参数或返回值
    装饰器的核心是高阶函数。例如,一个记录函数执行时间的高阶函数:

    import time
    
    def timer(func):
        def wrapper():
            start = time.time()
            func()  # 执行原函数
            end = time.time()
            print(f"函数执行耗时:{end - start:.2f}秒")
        return wrapper  # 返回新函数
    
    def my_function():
        time.sleep(1)
    
    # 手动包装函数
    my_function = timer(my_function)
    my_function()  # 调用增强后的函数
    
  3. 装饰器语法糖:@符号
    使用@装饰器名简化包装过程,等价于手动赋值:

    @timer  # 等价于 my_function = timer(my_function)
    def my_function():
        time.sleep(1)
    
    my_function()  # 直接调用即可增强功能
    
  4. 处理带参数的函数
    若原函数有参数,需在装饰器内层函数中定义兼容参数:

    def timer(func):
        def wrapper(*args, **kwargs):  # 接受任意参数
            start = time.time()
            result = func(*args, **kwargs)  # 将参数传递给原函数
            end = time.time()
            print(f"执行耗时:{end - start:.2f}秒")
            return result  # 返回原函数的返回值
        return wrapper
    
    @timer
    def greet(name, age):
        return f"{name} is {age} years old."
    
    print(greet("Bob", 20))  # 正常传递参数
    
  5. 装饰器本身带参数
    若需向装饰器传递参数(如@decorator(param=1)),需嵌套两层函数:

    def repeat(n=3):  # 外层接收装饰器参数
        def decorator(func):  # 中层接收被装饰函数
            def wrapper(*args, **kwargs):
                for _ in range(n):
                    result = func(*args, **kwargs)
                return result
            return wrapper
        return decorator
    
    @repeat(n=2)  # 指定重复次数
    def say_hello():
        print("Hello!")
    
    say_hello()  # 输出两次"Hello!"
    
  6. 保留原函数的元信息
    装饰器会覆盖原函数的名称、文档等元信息,使用functools.wraps修复:

    from functools import wraps
    
    def timer(func):
        @wraps(func)  # 将原函数的元信息复制到wrapper
        def wrapper(*args, **kwargs):
            # ... 同上
        return wrapper
    
    @timer
    def example():
        """示例函数文档"""
        pass
    
    print(example.__name__)  # 输出"example"而非"wrapper"
    

总结
装饰器通过函数嵌套和参数传递实现功能增强,其核心是理解函数作为对象、闭包和作用域。实际应用中,结合*args**kwargsfunctools.wraps可编写通用且健壮的装饰器。

Python中的装饰器 描述 : 装饰器是Python中一种强大的语法特性,允许在不修改原函数代码的情况下,动态地增强函数的功能。它本质上是一个高阶函数,接受一个函数作为参数,并返回一个新的函数。装饰器常用于日志记录、性能测试、权限校验等场景。 解题过程 : 基础概念:函数作为对象 在Python中,函数是一等对象,意味着函数可以像变量一样被传递、赋值或作为其他函数的参数/返回值。例如: 高阶函数:函数作为参数或返回值 装饰器的核心是高阶函数。例如,一个记录函数执行时间的高阶函数: 装饰器语法糖:@符号 使用 @装饰器名 简化包装过程,等价于手动赋值: 处理带参数的函数 若原函数有参数,需在装饰器内层函数中定义兼容参数: 装饰器本身带参数 若需向装饰器传递参数(如 @decorator(param=1) ),需嵌套两层函数: 保留原函数的元信息 装饰器会覆盖原函数的名称、文档等元信息,使用 functools.wraps 修复: 总结 : 装饰器通过函数嵌套和参数传递实现功能增强,其核心是理解函数作为对象、闭包和作用域。实际应用中,结合 *args 、 **kwargs 和 functools.wraps 可编写通用且健壮的装饰器。