12-装饰器

用于装饰函数

什么是装饰器,从表面上看,装饰器,那就得有装饰物和被装饰物吧,有了装饰物,就可以把被装饰物变得更漂亮些、功能更多些……

没错,在python中装饰器就扮演着装饰物的角色,那么问题来了,被装饰物是什么?实际上,我们需要另外重新定义一个新的函数(就是一个普通的函数),然后它就可以作为被装饰物了,当它被装饰器装饰过后,我们就称它为 被装饰函数

装饰器如何装饰被装饰函数,可以用一个 @ 符号来将两者联系起来。@是什么意思,就当做跟 qq一样就行了,在qq群发消息不是有 @某人吗,这样就可以跟对方建立联系了;在python就理解为 @装饰器 就行了。

例如:

#装饰器
def aaa(fun):                   #定义装饰器,名为aaa
    def bbb(*args, **kwargs):   #定义包装器函数bbb,用来修饰被装饰函数
        print('开始运行')
        fun(*args, **kwargs)
        print('运行结束')
    return bbb

@aaa
def xxx(str1='xxx'):               #定义被装饰函数xxx
    print('I am {}'.format(str1))

@aaa
def yyy(str2='yyy'):                #定义被装饰函数yyy
    print('I am {}'.format(str2))

调用一下:

>>>xxx()
开始运行
I am xxx
运行结束
------------------------------------
>>>yyy()
开始运行
I am yyy
运行结束

可以看到,只是调用了xxx函数,它就打印了属于aaa函数的东西,也就是说,xxx函数被aaa装饰了,它的功能更丰富了。

再来看一下这个装饰器函数:

#装饰器
def aaa(fun):                   #定义装饰器,名为aaa
    def bbb(*args, **kwargs):   #定义包装器函数bbb,用来修饰被装饰函数
        print('开始运行')
        fun(*args, **kwargs)
        print('运行结束')
    return bbb

装饰器名为aaa,携带了一个参数 fun,与一些普通函数的参数不同的是,装饰器函数携带的参数也是一个函数,也就是说在调用时传入了一个函数作为参数。

然后在装饰器内部还有一个函数 bbb,而且携带了参数 *args, **kwargs,之前在函数篇讲过了,带一个星号的参数 *args 表示可以接收多个传入的数据,函数会将这多个数据作为元组处理;而带两个星号的参数**kwargs表示可接收多个 默认参数,函数会将这多个默认参数作为字典处理。然而我们在定义装饰器时,并不知道被装饰函数需要几个参数,所以通过这样做,不论被装饰函数需要传入多少个参数都可以了。

最后装饰器返回的是内部包装函数bbb。

装饰器也可以带参数

只需要把装饰器理解成函数就可以了,函数可以带参数,所以装饰器也应该可以带参数

def sss(action):
    def aaa(fun):
        def bbb(*args, **kwargs):
            if action:
                print('用了aaa装饰器')
                fun(*args, **kwargs)
                print('用完aaa装饰器')   
            else:
                print('没有进行装饰')
        return bbb
    return aaa

@sss(1)
def xxx(str1='xxx'):
    print('I am {}'.format(str1))

@sss(0)
def yyy(a, b, c):
    print('I am ',a,b,c,sep=' ')

调用:

>>>xxx(111)
用了aaa装饰器
I am 111
用完aaa装饰器
>>>yyy(1,2,3)
没有进行装饰
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

[小G]

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值