python 装饰器

目的:在不动原函数的情况下,对函数进行修改,比如进行权限验证。

一、无参数传递的函数加装饰器

无装饰器,使用函数进行

def add_1(a):
    def add_2():
        print('-'*30+'装饰权限校验')
        a()
    return add_2

def check1():
    print('{:-^30}'.format('check1'))

check1=add_1(check1)

check1()

运行过程:将函数check1作为参数传递给add_1函数,add_1返回内层函数add_2,将内存函数add_2传递给check1,再将check1实例化,就相当于将add_2实例化运行,运行过程中先打印权限校验,再调用之前传递进来的check1函数。

打印结果:

有装饰器

def add_1(a):
    def add_2():
        print('-'*30+'装饰权限校验')
        a()
    return add_2

@add_1
def check1():
    print('{:-^30}'.format('check1'))


check1()

打印结果:

 两者比较,相当于 @add_1 替代了 check1 = add_1(check1) ,并且前移到函数定义之前

!!!装饰器中 a (外层函数的参数)存在的意义,让装饰器内部能够调用传入的函数!!!!

二、有参数的函数加装饰器

装饰器函数的内层函数相当于对需要装饰的函数,进行了重写,所以参数需要和被装饰的函数一致

一个参数:

def add_1(a):
    def add_2(b):
        print('-'*30+'装饰权限校验')
        a(b)
    return add_2

@add_1
def check1(num):
    print('{:-^30}{}'.format('check1',num))


check1(999)

打印结果:

 多个参数:使用不定长参数

def add_1(a):
    def add_2(b,*args,**kwargs):
        print('-'*30+'装饰权限校验')
        a(b,*args,**kwargs)
    return add_2

@add_1
def check1(num,*args,**kwargs):
    print('{:-^30}{}'.format('check1',num))
    print(args)
    print(kwargs)

check1(999,11)
check1(999,11,'jj',f=1,ff=22)

打印结果:

三、有参数、有返回值的函数加装饰器

需要在原先装饰器内层函数的调用函数位置,进行返回

def add_1(a):
    def add_2(*args,**kwargs):
        print('-'*30+'装饰权限校验')
        return  a(*args,**kwargs)
    return add_2

@add_1
def check1(*args,**kwargs):
    print('*'*30,args)
    print(kwargs,'!'*30)
    return args,kwargs


print(check1(100))

打印结果:

四、对一个参数使用多个装饰器装饰

装饰顺序:先调用离被装饰函数近的装饰器,再调用离被装饰函数远的装饰器

调用函数的顺序:先调用离被装饰函数远的装饰器(最上面),再调用离被装饰函数近的装饰器(下面)

就和打包一样,打包的时候,先打包内层,再打包外层

使用打包好的东西时,先拆外层,再拆内层

def add_1(a):
    def add_2(*args,**kwargs):
        print('-'*30+'装饰权限校验1')
        return  a(*args,**kwargs)
    return add_2

def bba_1(a):
    def bba_2(*args,**kwargs):
        print('-'*30+'装饰权限校验2')
        return  a(*args,**kwargs)
    return bba_2

@bba_1
@add_1
def check1(*args,**kwargs):
    print('*'*30,args)
    print(kwargs,'!'*30)
    return args,kwargs


print(check1(100))

 打印结果:

 五、在装饰器中传递参数

应用:权限校验分级,一级校验...二级校验

在原装饰器函数外层,在加上一层函数,接收参数,放入函数内部

在最内层对,传入的参数进行操作

def qqq(num):
    def add_1(a):
        def add_2(*args,**kwargs):
            if num == 1:
                print('-'*30+'装饰权限校验1')
            elif num == 2:
                print('*' * 30 + '装饰权限校验2')
            else:
                print('不进行校验,随意操作')
            return  a(*args,**kwargs)
        return add_2
    return add_1

@qqq(1)
def check1(*args,**kwargs):
    print('*'*30,args)
    print(kwargs,'!'*30)
    return args,kwargs


print(check1(100))

打印结果:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值