之前的文章已经介绍了装饰器,它本质也是一个方法,只不过它的入参也是一个方法,返回的也是一个方法,目的就是能够对传入的方法做前置或后置的处理。见下图,func被decorator装饰后实际上已经变成了另外一个方法。

python装饰器简明教程(python装饰器创建带参数的装饰器)(1)

装饰器如何带参数

下面是一个简单的示例,本身没有什么意义,只是为了聚焦带参数的装饰器本身,唯一不太好理解的就是logged方法中又嵌套定义了两个方法decorate、wrapper,python中一切都是对象,既然方法内部可以定义数组、数字、字符串等,那么定义方法也没有什么不可以的,因为它们都是python对象,暂时不理解也不要过于纠结,承认这样做是可以的就是了。

from functools import wraps def logged(message="带参数的装饰器"): def decorate(func): @wraps(func) def wrapper(*args, **kwargs): print(message) return func(*args, **kwargs) return wrapper return decorate # 使用默认参数 @logged() def add(x, y): return x y @logged("这是一个装饰器传入的参数") def spam(): print('Spam!') add(3,4) spam()

实际执行结果如下,我们看到被logged装饰后的方法add、spam执行后分别打印了logged默认的message值和指定的message值,实现了装饰器携带参数。

python装饰器简明教程(python装饰器创建带参数的装饰器)(2)

如果我们只关注logged内部的decorate方法就会发现,它和之前介绍的无参数的装饰器非常相似,而使用装饰器的方法如@logged()实际上就是对logged方法进行了调用,返回的就是decorate方法。参见下图,logged(mesaage)调用的返回结果就相当于开头的decorator方法,它接受func作为参数。

python装饰器简明教程(python装饰器创建带参数的装饰器)(3)

,