首页 > 试题广场 >

考虑以下使用了带参数的装饰器的代码,Python 解释器在执

[单选题]
考虑以下使用了带参数的装饰器的代码,Python 解释器在执行此脚本时,各个 `print` 语句的输出顺序是什么?
def log_level(level):
    print(f"(1) Decorator factory called with level: {level}")
    def decorator(func):
        print(f"(2) Decorator applied to {func.__name__}")
        def wrapper(*args, **kwargs):
            print(f"(3) Wrapper called for {func.__name__}")
            return func(*args, **kwargs)
        return wrapper
    return decorator
@log_level("INFO")
def process_data():
    print("(4) Executing process_data")
print("(5) Main script body")
process_data()
  • (5), (1), (2), (3), (4)
  • (1), (2), (5), (3), (4)
  • (1), (5), (2), (3), (4)
  • (5), (3), (4)
  1. 装饰器工厂(参数化装饰器)

    • 装饰器可以接受参数(如log_level("INFO")),此时需要三层嵌套函数:

      • 外层函数(如log_level)接收参数并返回装饰器函数

      • 中层函数(如decorator)接收被装饰函数

      • 内层函数(如wrapper)包裹原函数并添加新功能

  2. 装饰器的执行时机

    • 装饰器在模块加载阶段(代码解释时)立即执行,而非函数调用时

      。这就是为什么(1)和(2)在(5)之前打印。
  3. 闭包机制

    • 装饰器依赖闭包保留外部函数的变量(如level和func),即使外部函数已执行完毕,内层函数仍能访问这些变量

  4. 函数替换本质

    • @log_level("INFO")等价于process_data = log_level("INFO")(process_data),最终process_data被替换为wrapper函数

发表于 2025-12-17 09:37:58 回复(0)
类和函数初始化时都可以被预定义
发表于 2025-10-21 11:23:43 回复(0)