python装饰器简明教程(python装饰器创建带参数的装饰器)
之前的文章已经介绍了装饰器,它本质也是一个方法,只不过它的入参也是一个方法,返回的也是一个方法,目的就是能够对传入的方法做前置或后置的处理。见下图,func被decorator装饰后实际上已经变成了另外一个方法。
装饰器如何带参数
下面是一个简单的示例,本身没有什么意义,只是为了聚焦带参数的装饰器本身,唯一不太好理解的就是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值,实现了装饰器携带参数。
如果我们只关注logged内部的decorate方法就会发现,它和之前介绍的无参数的装饰器非常相似,而使用装饰器的方法如@logged()实际上就是对logged方法进行了调用,返回的就是decorate方法。参见下图,logged(mesaage)调用的返回结果就相当于开头的decorator方法,它接受func作为参数。
,
免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com