装饰器的目的:
装饰器就是在不修改被装饰对象源代码与调用方式的前提下为其添加新功能。
无参装饰器模板:
1 #此处的outsider为装饰器,可将其至于被装饰函数顶部,利用@outsider的方式来装饰被装饰函数 2 def outsider(func): 3 """ 4 :param func: 被装饰函数名 5 :return: 返回outsider.wrapper的内层地址 6 """ 7 def wrapper(*args,**kwargs): 8 """ 9 :param args:被装饰函数本身所需参数 10 :param kwargs:被装饰函数本身所需参数 11 :return: 被装饰函数的返回值 12 """ 13 #此处可增加新的业务逻辑。。。 14 res = func(*args,**kwargs) 15 #此处可增加新的业务逻辑。。。 16 return res 17 return wrapper
有参装饰器模板:
1 def 有参装饰器(x,y): 2 """ 3 :param x: 有参装饰器参数1 4 :param y: 有参装饰器参数2 5 。。。 6 :return: 返回有参装饰器.outsider的内存地址 7 """ 8 def outsider(func): 9 """ 10 :param func: 被装饰函数名 11 :return: 返回outsider.wrapper的内层地址 12 """ 13 def wrapper(*args,**kwargs): 14 """ 15 :param args:被装饰函数本身所需参数 16 :param kwargs:被装饰函数本身所需参数 17 :return: 被装饰函数的返回值 18 """ 19 #此处可增加业务逻辑。。。 20 res = func(*args,**kwargs) 21 #此处可增加业务逻辑。。。 22 return res 23 return wrapper 24 return outsider 25 26 27 """ 28 有参装饰器调用方式(以@有参装饰器(x=1,y=2)为例): 29 步骤一:先执行 有参装饰器(x=1,y=2),返回outsider 30 步骤二:组成@outsider的无参装饰器 31 步骤三:在执行@outsider的无参装饰器的代码,返回wrapper 32 步骤四:在执行新增的业务逻辑与被装饰函数,并返回res 33 """ 34 @有参装饰器(x=1,y=2) 35 def 被装饰对象(): 36 pass
有参装饰器warps:注意python提供的有参装饰器wraps需要导入
1 from functools import wraps 2 3 def outsider(func): 4 """ 5 :param func: 被装饰函数名 6 :return: 返回outsider.wrapper的内层地址 7 """ 8 @wraps(func) ###将原函数func的所有内置函数均添加到wrapper函数中,目的是将闭包函数wrapper伪装的与原函数func完全一致### 9 def wrapper(*args,**kwargs): 10 """ 11 :param args:被装饰函数本身所需参数 12 :param kwargs:被装饰函数本身所需参数 13 :return: 被装饰函数的返回值 14 """ 15 #此处可增加业务逻辑。。。 16 res = func(*args,**kwargs) 17 #此处可增加业务逻辑。。。 18 return res 19 return wrapper