【Python成长之路】python 基础篇 -- 装饰器
【摘要】 有时候看到大神们的代码,偶尔会用到@来装饰函数。当时查了资料,大致了解装饰器一般用于在不改变原函数的基础上 ,对原函数功能进行修改/增强。使用场景是:日志级别设置、权限校验、性能测试等。
【写在前面】
有时候看到大神们的代码,偶尔会用到@来装饰函数。当时查了资料,大致了解装饰器一般用于在不改变原函数的基础上 ,对原函数功能进行修改/增强。使用场景是:日志级别设置、权限校验、性能测试等。
在当前工作中,还没具体使用到这一神器。所以想着,先了解下装饰器的使用方法,方便以后工作时用到。
【小碎步走起来】
1、实现a+b的功能
def A(a, b): print(a + b) return a + b if __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 @B def A(a, b): print(a + b) return a + b if __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 + b if __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 : PyCharm def 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 B def 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) @E def A(a, b): print(a + b) return a + b if __name__ == "__main__": A(1, 2) 输出结果是: 我是D 装饰器 当前输入值内容变为:1 2 我是E 装饰器 当前输入值内容变为:3 4 27
当出现多个装饰器,按顺序分别进行对应功能的计算,因此根据以上示例代码,先进行装饰器D的计算,将a/b变为3/4;然后进入装饰器E的计算,将a/b变为了13/14,最后进入A()函数,并输出27。
【写在后面】
由于当前对装饰器了解不深,只是知道了大致的用法。因此先做个笔记,等以后翅膀硬了再来叨叨下。
(如果内容介绍有偏差或者不正确的地方,欢迎大家指正。)
作者:鹏哥贼优秀
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)