MST
星途 面试题库

面试题:Python装饰器:多层装饰与参数传递

编写一个Python装饰器,它既可以接受参数,又能处理多层装饰的情况。例如,@decorator('参数值') 这种形式。并且在多层装饰时,能够按照正确的顺序处理。请解释代码逻辑,特别是在参数传递和多层调用时的工作机制。
41.3万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试
def decorator(arg):
    def outer(func):
        def inner(*args, **kwargs):
            print(f"执行装饰器,参数为: {arg}")
            return func(*args, **kwargs)
        return inner
    return outer


@decorator('第一层装饰器参数')
@decorator('第二层装饰器参数')
def test_function():
    print("执行被装饰函数")


test_function()

代码逻辑解释

  1. 参数传递机制
    • decorator函数是最外层函数,它接受一个参数arg。这个函数返回一个内部函数outer
    • 当使用@decorator('参数值')这种形式时,'参数值'会作为arg传递给decorator函数。
  2. 多层调用机制
    • 当有多层装饰,如@decorator('第一层装饰器参数')@decorator('第二层装饰器参数')时,装饰器是从下往上执行的。
    • 对于@decorator('第二层装饰器参数')'第二层装饰器参数'作为arg传递给decorator函数,返回outer函数,此时outer函数的参数func是被装饰的函数test_functionouter函数返回inner函数,这个inner函数现在“包裹”了test_function
    • 对于@decorator('第一层装饰器参数'),同样的过程发生,此时outer函数的参数func是上一层装饰返回的inner函数。所以现在inner函数又被包裹了一层新的inner函数。
    • 当调用test_function()时,实际上调用的是最外层的inner函数。这个inner函数先打印出“执行装饰器,参数为: 第一层装饰器参数”,然后调用下一层的inner函数,下一层inner函数打印出“执行装饰器,参数为: 第二层装饰器参数”,最后调用原始的test_function,打印“执行被装饰函数”。这样就保证了多层装饰按照正确的顺序处理。