上述例子中通过装饰函数login()函数实现了登录功能,add_to_shopcar这个函数作为参数被传入login函数,从而实现了登录。
通过语法糖的方式实现装饰器
由于 @login 完全等价于add_to_shopcar = login(add_to_shopcar),所以在我们执行 login(add_to_shopcar) 之后返回的函数是装饰函数deco_login,而不是add_to_shopcar。但这与装饰器的初衷是相违背的:不改变原函数的情况下,增加函数功能,使用装饰器改变了原函数的元信息.__name__、.__docstring__等信息。
那么如何才能是被装饰函数的元信息不改变呢,在这里我么使用python内置的装饰器 @wraps,
@wraps 的作用:避免装饰器对原函数的元信息进行更改,比如函数的docstring,__name__,等参数列表,格式:@wraps(被装饰函数名称)。使用试试看看被装饰函数本身带参数,那么在装饰函数的参数必须与被装饰函数保持一致。
原函数多个参数
指装饰器本身是一个类,类装饰器需要实现2个方法:__init__、__call__方法。
当类装饰器本身不带任何参数时,__init__:接受被装饰函数、__call__:实现装饰逻辑。
当类装饰器带参数的情况:__init__:接受参数、__call__:接受被装饰参数和实现装饰逻辑,举例如下。
备注:学习装饰器,可以先学习python的闭包函数:参考:https://blog.csdn.net/u013380694/article/details/90019571?utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.control&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.control
装饰器的高阶用法参考:http://www.360doc.com/content/19/0602/18/40585874_839852693.shtml
记录学习 有错误,感谢斧正。