Python-23_装饰器-04_练习---无参装饰器有参装饰器

Posted newmet

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python-23_装饰器-04_练习---无参装饰器有参装饰器相关的知识,希望对你有一定的参考价值。

一、无参装饰器:

京东后端程序简写,并加上验证功能:
编写一个装饰器,提供验证功能:
# 用户信息表:
user_list=[
    {name:new1,passwd:123},
    {name:new2,passwd:123},
    {name:new3,passwd:123},
    {name:new4,passwd:123},
]

dic = {"username": None, "login": False}   # 定义一个全局变量 记录当前用户的状态
def verify(func):
    def foo(*args, **kwargs):
        if dic["username"] and dic["login"]:  # 判断:如果全局变量存在,执行这一步
            res = func(*args, **kwargs)
            return res
        username = input("用户名:").strip()
        password = input("密码:").strip()
        for user_dic in user_list:
            if username == user_dic["name"] and password == user_dic["passwd"]:
                dic["username"]=username       # 全局变量重新赋值
                dic["login"]=True
                res = func(*args, **kwargs)
                return res
        else:
            print("用户名或密码错误")

    return foo


# 1、定义欢迎进入京东界面:
@verify
def index():
    print("欢迎光临京东购物")
    return "请尽情放纵吧!!"


# 2、定义购物车:
@verify
def shopping_cart(product):
    print("这是您所想购买的物品 %s,如有需要,清下单哦" % product)


# 3、定义订单信息:
@verify
def order():
    print("这是你以下订单详细信息")


res = index()
print(res)
shopping_cart("奶茶")
order()
问题:调用一个函数 要输入一次验证,调用一个函数 要输入一次验证,不正常
解决:第一登陆后,保存状态,以供后续函数使用(定义一个全局变量)
二、有参装饰器:
# 用户信息表:
user_list=[
    {name:new1,passwd:123},
    {name:new2,passwd:123},
    {name:new3,passwd:123},
    {name:new4,passwd:123},
]

dic = {"username": None, "login": False}   # 定义一个全局变量 记录当前用户的状态
def auth(auth_type="filedb"):           # 在原本无参装饰器外、再嵌套一个函数
    def verify(func):
        def foo(*args, **kwargs):
            print("认证类型",auth_type)
            if auth_type=="filedb":         # 判断认证类型
                if dic["username"] and dic["login"]:  # 判断:如果全局变量存在,执行这一步
                    res = func(*args, **kwargs)
                    return res
                username = input("用户名:").strip()
                password = input("密码:").strip()
                for user_dic in user_list:
                    if username == user_dic["name"] and password == user_dic["passwd"]:
                        dic["username"]=username       # 全局变量重新赋值
                        dic["login"]=True
                        res = func(*args, **kwargs)
                        return res
                else:
                    print("用户名或密码错误")
            elif auth_type=="1111":
                print("认证类型是1111,执行此操作")

            else:
                print("认证类型是别的种类,执行此操作")
                res = func(*args, **kwargs)
                return res
        return foo
    return verify

# 1、定义欢迎进入京东界面:
@auth(auth_type="filedb")       # verify = auth(auth_type="filedb")---->@verify
def index():
    print("欢迎光临京东购物")
    return "请尽情放纵吧!!"


# 2、定义购物车:
@auth(auth_type="filedb")
def shopping_cart(product):
    print("这是您所想购买的物品 %s,如有需要,清下单哦" % product)


# 3、定义订单信息:
@auth(auth_type="1111")
def order():
    print("这是你以下订单详细信息")


res = index()
print(res)
shopping_cart("奶茶")
order()
问题:调用一个函数 要输入一次验证,调用一个函数 要输入一次验证,不正常
解决:第一登陆后,保存状态,以供后续函数使用(定义一个全局变量)



以上是关于Python-23_装饰器-04_练习---无参装饰器有参装饰器的主要内容,如果未能解决你的问题,请参考以下文章

Python__装饰器练习题

Python__装饰器练习题

Python(73)_装饰器函数练习_执行函数前登录验证

Python练习-装饰器版-为什么我的用户总被锁定

python学习5_装饰器

四大器