假设有带参装饰器decorator(*args, **kwargs),使用该装饰器装饰函数func(*args2, **kwargs2):
@decorator(*args, **kwargs)
def func(*args2, **kwargs2):
...
实际上是以下写法专的语法糖:
def func(*args2, **kwargs2):
...
func decorator(*args, **kwargs)(func)
如你所见,调用decorator(*args, **kwargs)返回的是属一个callable对象(通常是一个函数,该函数用作内层装饰器),然后进一步调用此callable对象并传递函数func作为参数,得到一个被装饰过后的函数func&39;,令变量func重新指向这个函数func&39;。因此,这种带参的装饰器通常有三层,外层装饰器返回内层装饰器,内层装饰器返回装饰后的函数。