zoukankan      html  css  js  c++  java
  • python 15 带参装饰器

    2. 带参数的装饰器

    #在装饰器的基础上再套一层
    def auth(argv):
        def wrapper(func):
            def inner(*args,**kwargs):
                func(*args,**kwargs)
            return inner
        return wrapper
    @auth()  # 可传参
    def func():
        pass
    func()
    #解开:
    """
    wrapper = auth()
    func = wrapper(func)
    func()
    """
    
    #示例:实现选择不同的登录方式
    login_dic = {"username": None,"flag": False}
    # 正确的案例
    msg = """
    QQ
    微信
    抖音
    邮箱
    请输入您要选择登陆的app:
    """
    chose = input(msg).upper()
    
    def auth(argv):
        def wrapper(func):
            def inner(*args,**kwargs):
                if login_dic["flag"]:
                    func(*args,**kwargs)
                else:
                    if argv == "QQ":
                        print("欢迎登陆QQ")
                        user = input("username:")
                        pwd = input("password:")
                        if user == "alex" and pwd == "alex123":  # qq
                            login_dic["flag"] = True
                            login_dic["username"] = user
                            func(*args,**kwargs)
                        else:
                            print("用户名或密码错误!")
                    elif argv == "微信":
                        print("欢迎登陆微信")
                        user = input("username:")
                        pwd = input("password:")
                        if user == "1351101501" and pwd == "alex":  # 微信
                            login_dic["flag"] = True
                            login_dic["username"] = user
                            func(*args, **kwargs)
                        else:
                            print("用户名或密码错误!")
                    elif argv == "抖音":
                        print("来了,老弟!")
                        user = input("username:")
                        pwd = input("password:")
                        if user == "alexdsb" and pwd == "alex":  # 抖音
                            login_dic["flag"] = True
                            login_dic["username"] = user
                            func(*args, **kwargs)
                        else:
                            print("用户名或密码错误!")
                    else:
                        print("欢迎登陆dab邮箱")
                        user = input("username:")
                        pwd = input("password:")
                        if user == "alexdsb@dsb.com" and pwd == "alex":  # 邮箱
                            login_dic["flag"] = True
                            login_dic["username"] = user
                            func(*args, **kwargs)
                        else:
                            print("用户名或密码错误!")
    
            return inner
        return wrapper
    @auth(chose)
    def foo():
        print("这是一个被装饰的函数")
    foo()
    """
    # @auth(chose) 相等于以下两行代码的解构:
    # wrapper = auth(chose)
    # foo = wrapper(foo)
    """
    

    3. 多个装饰器装饰一个函数

    #先执行离被装饰的函数最近的语法糖。
    #小技巧:进入装饰器从上往下,走到最会一个装饰器执行被装饰的函数,退出装饰器从下往上走。
    

    1563957356826

    def wrapper1(f):
        def inner1(*args,**kwargs):
            print("这是第一个函数的开始!")
            f()
            print("这是第一个函数的结束!")
        return inner1
    def wrapper2(f):    # f = inner3
        def inner2(*args,**kwargs):
            print("这是第二个函数的开始!")
            f()
            print("这是第二个函数的结束!")
        return inner2
    def wrapper3(f):
        def inner3(*args,**kwargs):
            print("这是第三个函数的开始!")
            f()
            print("这是第三个函数的结束!")
        return inner3
    @wrapper1
    @wrapper2
    @wrapper3
    def func():
        print("这是被调用的函数!")
    func()
    
    #解开:
    #func = wrapper3(func)     #func == inner3
    #func = wrapper2(func)     #func == wrapper2(inner3)  func = inner2
    #func = wrapper1(func)     #func == wrapper1(inner2)  func = inner1
    #func()                    #inner1()
    
    
    """
    这是第一个函数的开始!
    这是第二个函数的开始!
    这是第三个函数的开始!
    这是被调用的函数!
    这是第三个函数的结束!
    这是第二个函数的结束!
    这是第一个函数的结束!
    """
    
  • 相关阅读:
    关于js计算非等宽字体宽度的方法
    [NodeJs系列]聊一聊BOM
    Vue.js路由管理器 Vue Router
    vue 实践技巧合集
    微任务、宏任务与Event-Loop
    事件循环(EventLoop)的学习总结
    Cookie、Session和LocalStorage
    MySQL 树形结构 根据指定节点 获取其所在全路径节点序列
    MySQL 树形结构 根据指定节点 获取其所有父节点序列
    MySQL 创建函数报错 This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators
  • 原文地址:https://www.cnblogs.com/yzm1017/p/11247081.html
Copyright © 2011-2022 走看看