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

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

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

Copyright © 2024 有趣生活 All Rights Reserve吉ICP备19000289号-5 TXT地图HTML地图XML地图