DAY12 闭包函数 装饰器

闭包函数

def f1(x):
	def f2():
		print(x)
	return f2
	
f = f1(5)  # f-->f2,x=5
f()  # f()-->f2(),x=5  # 5
f()  # 5


f3 = f1(3)  # f-->f2,x=3
f3()  # f()-->f2(),x=3  # 3
f3()  # 3
  • 把内部定义的变量放到内部的函数中,让两者一起返回出去

装饰器

def deco(func):
	def wrapper(*args,**kwargs):  # 赋值后的time_sleep
		res = func(*args,**kwargs)  # 真正的time_sleep
		
		return res
	return wrapper

@deco  # time_sleep(赋值后的) = deco(time_sleep(真正的))
def time_sleep(name,age,height=168):
	print(name,age,height)
	return 123
time_sleep('CHH','22')

无参装饰器

is_login_dict = {'username': None}


def login_deco(func):
    
    def wrapper(*args, **kwargs):  # 赋值后的time_sleep

        if not is_login_dict['username']:

            username = input('请输入你的用户名》》》').strip()

            if username != 'fanping':
                print('非法登录')

                return

            is_login_dict['username'] = username

            res = func(*args, **kwargs)  # 真正的time_sleep

            return res
        else:
            res = func(*args, **kwargs)  # 真正的time_sleep

            return res         

    return wrapper


@login_deco
def shopping():
    print('from shopping')


@login_deco
def withdraw():
    print('from withdraw')

有参装饰器

is_login_dict = {'username': None}

def auth(origin):
    
    def login_deco(func):

        def wrapper(*args, **kwargs):  # 赋值后的time_sleep

            if origin == 'file':

                if not is_login_dict['username']:

                    username = input('请输入你的用户名》》》').strip()

                    if username != 'fanping':
                        print('非法登录')

                        return

                    is_login_dict['username'] = username

                    res = func(*args, **kwargs)  # 真正的time_sleep

                    return res
                else:
                    res = func(*args, **kwargs)  # 真正的time_sleep

                    return res

            elif origin == 'mongodb':
                print('非法登录')
                
            else:
                print('dsb')


        return wrapper
    
    return login_deco


# f = origin('file')  # login_deco
# shopping = f(shopping)
# shopping()


@auth('file')
def shopping():
    print('from shopping')


@auth('mongodb')
def withdraw():
    print('from withdraw')

image

  • 装饰器是为了给函数增加功能,但是不改变函数内部语法,不改变函数调用方式
posted @ 2025-08-10 17:19  CHENHANG123  阅读(6)  评论(0)    收藏  举报