【Python成长之路】python 基础篇 -- 装饰器

举报
技术火炬手 发表于 2020/07/27 17:39:20 2020/07/27
【摘要】 有时候看到大神们的代码,偶尔会用到@来装饰函数。当时查了资料,大致了解装饰器一般用于在不改变原函数的基础上 ,对原函数功能进行修改/增强。使用场景是:日志级别设置、权限校验、性能测试等。

【写在前面】

    有时候看到大神们的代码,偶尔会用到@来装饰函数。当时查了资料,大致了解装饰器一般用于在不改变原函数的基础上 ,对原函数功能进行修改/增强。使用场景是:日志级别设置、权限校验、性能测试等。

    在当前工作中,还没具体使用到这一神器。所以想着,先了解下装饰器的使用方法,方便以后工作时用到。

【小碎步走起来】

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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。