【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。

 

【写在后面】

由于当前对装饰器了解不深,只是知道了大致的用法。因此先做个笔记,等以后翅膀硬了再来叨叨下。

(如果内容介绍有偏差或者不正确的地方,欢迎大家指正。)

 

【关于鹏哥】

有兴趣的朋友或者愿意一起学习python的同学,可以关注公众号"鹏哥贼优秀",一起学习进步呗!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值