python装饰器

def w1(func):
    def inner():
        print('...验证权限...')
        func()
    return inner
@w1
def f1():
    print('f1 called')
@w1
def f2():
    print('f2 called')
f1()
f2()

输出结果:

...验证权限...
f1 called
...验证权限...
f2 called

装饰器原理

首先,看装饰器函数w1,该函数接收一个参数func,其实就是接收一个方法名,w1内部又定义一个函数inner,在inner函数中增加权限校验,并在验证完权限后调用传进来的参数func,同时w1的返回值为内部函数inner,其实就是一个闭包函数。

然后,再来看一下,在f1上增加@w1,那这是什么意思呢?当python解释器执行到这句话的时候,会去调用w1函数,同时将被装饰的函数名作为参数传入(此时为f1),根据闭包一文分析,在执行w1函数的时候,此时直接把inner函数返回了,同时把它赋值给f1,此时的f1已经不是未加装饰时的f1了,而是指向了w1.inner函数地址。

接下来,在调用f1()的时候,其实调用的是w1.inner函数,那么此时就会先执行权限验证,然后再调用原来的f1(),该处的f1就是通过装饰传进来的参数f1。

这样下来,就完成了对f1的装饰,实现了权限验证。

posted on 2018-09-13 15:22  yzy1  阅读(93)  评论(0编辑  收藏  举报

导航