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