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

闭包

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

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 outsidel1(test):

print('执行了装饰器外部函数1')

def inside(*args,**kwargs):

# 前者元祖 后者字典

print('welcome1')

return test(*args,**kwargs)

return inside

def outsidel2(test):

print('执行了装饰器外部函数2')

def inside(*args,**kwargs):

# 前者元祖 后者字典

print('welcome2')

return test(*args,**kwargs)

return inside

def func():

print('hello world')

# a = outsidel(func)

# a()

@outsidel1

@outsidel2

def func(*args,**kwargs)

print(kwargs)

#func([1,2,3])

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函数进行装饰

你可能感兴趣的:(闭包,装饰器,带参数的装饰器)