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

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

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

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