这篇文章主要讲解了“python的装饰器怎么用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“python的装饰器怎么用”吧!
1、实现a+b的功能
def A(a, b): print(a + b) return a + bif __name__ == "__main__": A(1, 2)
2、现在我想函数A不变的情况下,实现a+2+b*2的功能 -- 函数带参数或者参数数量不确定
def B(fun): def C(*args): a = args[0]+2 b = args[1]*2 return fun(a,b) return C@Bdef A(a, b): print(a + b) return a + bif __name__ == "__main__": A(1, 2) 输出结果:7
(1)在main函数运行A(1,2)时,先进入装饰器B中,并将a/b参数传给*args(这里args可表示不限数量的变量输入);在对参数a/b进行修改后,最后进入A函数进行 计算。
(2)函数B的入参是 fun,函数C的入参是 args,对应的实际值即为A(),(a,b)
3、在添加装饰器后,又想继续使用原函数功能 -- 装饰器带参数
def D(flag): def B(fun): def C(*args): if flag: a = args[0]+2 b = args[1]*2 return fun(a, b) else: return fun(*args) return C return B@D(flag=False)def A(a, b): print(a + b) return a + bif __name__ == "__main__": A(1, 2)输出结果:3
通过flag字段的判断,可以实现A()原功能或者A的增加功能。
这里要注意下,在原装饰器B函数外面又加了一层函数D,为 了加深印象,可 以这样理解:
D是为 了flag参数的,B是为了A()的,C是为了a/b参数的。对应的顺序是基于flag/A/ab的上下文决定。
4、在写完函数D后,发现又想 加新功能,怎么办? -- 装饰器叠罗汉。
# coding=utf-8# @Auther : "鹏哥贼优秀"# @Date : 2019/10/24# @Software : PyCharmdef D(flag): def B(fun): def C(*args): print("我是D 装饰器") print("当前输入值内容变为:", *args) if flag: a = args[0] + 2 b = args[1] * 2 return fun(a, b) else: return fun(*args) return C return Bdef E(fun): def F(*args): print("我是E 装饰器") print("当前输入值内容变为:",*args) a = args[0] + 10 b = args[1] + 10 return fun(a, b) return F@D(flag=True)@Edef A(a, b): print(a + b) return a + bif __name__ == "__main__": A(1, 2)输出结果是:我是D 装饰器当前输入值内容变为:1 2我是E 装饰器当前输入值内容变为:3 427
当出现多个装饰器,按顺序分别进行对应功能的计算,因此根据以上示例代码,先进行装饰器D的计算,将a/b变为3/4;然后进入装饰器E的计算,将a/b变为了13/14,最后进入A()函数,并输出27。
感谢各位的阅读,以上就是“python的装饰器怎么用”的内容了,经过本文的学习后,相信大家对python的装饰器怎么用这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
原文链接:https://my.oschina.net/u/4607048/blog/4475322