装璜器内核

python装璜器的内核其实是将函数作为参数传递到另一个函数体外部,也就是说在该函数执行前优先执行装璜器函数,利用场景包含用户验证,日志撰写,数据验证等等,能够防止多段的反复代码,晋升代码的可复用性。接下来将由浅入深的介绍三种以函数作为装璜器的根本模式。

不带参数的装璜器

先上代码

#不带参数的装璜器def func_name(func):    def inner():        print('decorator called')        func()    return inner@func_namedef s1():    print('s1 called')s1()    #开始执行#---------------执行后果-------------------#decorator called#s1 called

解说一下这段代码,代码执行入口为s1(),此时解释器接触到了func_name装璜器,于是此时s1()函数暂停执行,将s1作为一个参数带入到装璜器函数,解释器开始执行func_name(s1)(),依据func_name函数定义,执行函数inner(),因而首先打印decorator called,继续执行会打印s1 called。从而实现了在函数执行前先做一部分工作。

带参数的装璜器

接下来做一个用户验证的示例来解说,设想这样一个场景,零碎登录时,如果用户名明码正确那么能够进入零碎,否则就回绝进入,因而用户验证是零碎登陆这样一个性能之前必须经验的一个步骤。代码如下

#带参数的装璜器def dec(func):    def inner(*args,**kwargs):  #s2参数传递        print('开始装璜')        if kwargs.get('user')=='root' and kwargs.get('password')=='dlut':            print('验证通过')            func(*args,**kwargs)    #执行s2()        else:            print('验证不通过')  #不执行s2()    return inner@decdef s2(*args,**kwargs):    print('开始求和,打印关键词~')    print(sum(args))    print(kwargs)s2(3,6,8,user='root',password='dlut')   #函数入口#---------------执行后果-------------------#开始装璜#验证通过#开始求和,打印关键词~#17#{'user': 'root', 'password': 'dlut'}

同理,执行带参数的s2()函数时,遇到dec装璜器,将参数传递到装璜器外部定义的inner()函数中,从而能够获取相干参数进行用户验证。

装璜带返回值的函数

装璜具备返回值的函数应该怎么做呢,话不多说,代码如下

# 装璜带返回值的函数def dec2(func):    def inner(*args):        print('开始装璜~')        ret=func(*args)         return ret  #此处返回func_run函数的返回值即可    return inner@dec2def func_run(*args):    return sum(args)_sum=func_run(1,4,6)    #函数入口print('求和后果',_sum)#---------------执行后果-------------------#开始装璜~#求和后果 11
类用作润饰器

接下来给大家分享一段代码,对于类用作润饰器,它的性能是,通过润饰器实现用户验证,若验证胜利则继续执行函数,否则间接返回False

#类用作润饰器print('-------------------------')class Dec_obj(object): def __init__(self,func): self._func=func pass def __call__(self, *args, **kwargs): print('dec called')        if kwargs.get('user')=='mark' and kwargs.get('password')=='wo4xuhao': return self._func(*args,**kwargs)        else: return False@Dec_objdef func(*args, **kwargs): print('func entered')    return sum(args)print(func(2,6,9,user='mark',password='wo4xuhao'))

对于python函数装璜器的分享就到这里啦,还请务必亲自写代码实际!