美文网首页
闭包,装饰器,带参数的装饰器

闭包,装饰器,带参数的装饰器

作者: 栀心_d553 | 来源:发表于2020-02-28 16:16 被阅读0次

    闭包
    由于闭包引用了外部函数的局部变量,则外部函数的局部变量没有及时释放,消耗内存

    x = 300

    def test1():

    x=200
    
    def test2():
    
        # global x
    
        nonlocal x
    
        print('---1---x=%d'%x)
    
        x=100
    
        print('---2---x=%s'%x)
    
    return test2
    

    t1 = test1()

    t1()

    装饰器
    装饰器就是用于拓展函数功能的一种函数,它的特殊之处,在于它的返回值也是一个函数,使用装饰器的好处就是,在不用更改原函数代码的前提下,给函数增加新的功能

    def outside1(test):

    print('执行了装饰器外部函数1')
    
    def inside(*args,**kwargs):
    
        print('welcome1')
    
        return test(*args,**kwargs)
    
    return inside
    

    def outside2(test):

    print('执行了装饰器外部函数2')
    
    def inside(*args,**kwargs):
    
        print('welcome2')
    
        return test(*args,**kwargs)
    
    return inside
    

    @outside1

    @outside2

    def func(args,*kwargs):

    print(kwargs)
    
    # print(*args,**kwargs)
    
    # print('hello world')
    

    a = outside1(func)

    a()

    func(a=1,b=2)

    带参数的装饰器
    def set_level(level_num):

    def set_func(func):
    
        def call_func(*args,**kwargs):
    
            if level_num == 1:
    
                print('---权限级别1,验证---')
    
            elif level_num == 2:
    
                print('---权限级别2,验证---')
    
            elif level_num == 10:
    
                print('---权限级别10,验证---')
    
            return func()
    
        return call_func
    
    return set_func
    

    @set_level(10)

    def test1():

    print('---test1---')
    
    return 'ok'
    

    @set_level(2)

    def test2():

    print('---test2---')
    
    return 'ok'
    

    test1()

    test2()

    1、调用set_func并且将1当做实参传递

    2、用上一步调用的返回值,当做装饰器对test1函数进行装饰

    相关文章

      网友评论

          本文标题:闭包,装饰器,带参数的装饰器

          本文链接:https://www.haomeiwen.com/subject/wxhlhhtx.html