python装饰器+用法详解

python装饰器是拓展函数功能的一种函数。能够在不修改函数的前提下对函数进行整体加工,能够有效的防止代码入侵。

给以下代码增加权限:

def test(num):
    print("-----test----%d" % num)
    return "ok"

test(100)

修改后:

def test(num,level):
    if level == 1:
    print("权限1")
print("-----test----%d" % num) return "ok" test(100,1)

如果代码这样修改,就改变其原有结构,并且重新修改每一个调用的地方,不利于修改,也会对原有的代码产生一些意外的影响。

此时,就可以使用装饰器:

def set_privilege(level):
     def set_func(func):
        def call_func(*args, **kwargs):
            if level==1:
                print("权限1")
            if level==2:
                 print("权限2")
            return func(*args, **kwargs)
        return call_func
    return set_func

@set_privilege(1)
def test(num):
    print("-----test1-----%d" % num)
    return "ok"

@set_privilege(2)
def test2(num):
    print("------test2------%d" % num)        

test(100)
test2(200)

@set_privilege(1)相当于调用函数set_privilege传入实参1,拿到set_func的引用

再调用函数set_func装饰函数test

把函数test引用传入闭包,拿到函数call_func的引用

把函数call_func重新指向函数test。

也就是说,最后test(100)调用时不再直接指向原来的函数内存,而是通过装饰器 从函数set_privilge-->函数set_func-->函数call_func-->函数test,所以最终的test函数的功能会被改变。

 

posted @ 2018-10-08 22:10  拱猪白菜  阅读(73)  评论(0)    收藏  举报