• python装饰器概念与应用


    格式一:装饰器外层不传参,内层传参

    user_status = False  # 用户登录了就把这个改成True
    
    def login(func):  # 把要执行的henan模块从这里传进来
    
        def inner(*args, **kwargs):  # 再定义一层函数,参数为henan的参数
            _username = "alex"  # 假装这是DB里存的用户信息
            _password = "abc!23"  # 假装这是DB里存的用户信息
            global user_status
            if user_status == False:
                username = raw_input("user:")
                password = raw_input("password:")
                if username == _username and password == _password:
                    print("welcome login....")
                    user_status = True
                else:
                    print("wrong username or password!")
            if user_status == True:
                func(*args, **kwargs)  # 看这里看这里,只要验证通过了,就调用相应功能
    
        return inner  # 用户调用login时,只会返回inner的内存地址,下次再调用时加上()才会执行inner函数
    
    @login  #注意因为这里没有传参,所以没有括号
    def henan(t):
        print "henan********,%s" %t
    
    henan("henan args")

    运行结果--

    user:alex
    password:abc!23
    welcome login....
    henan********,henan args

    格式一:装饰器外层传参,内层传参

    user_status = False #用户登录了就把这个改成True
    
    def login(auth_type): #把要执行的参数从这里传进来
        def auth(func):   # 把要执行的henan模块从这里传进来
            def inner(*args,**kwargs):#再定义一层函数
                if auth_type == "qq":
                    _username = "alex" #假装这是DB里存的用户信息
                    _password = "abc!23" #假装这是DB里存的用户信息
                    global user_status
                    if user_status == False:
                        username = raw_input("user:")
                        password = raw_input("pasword:")
    
                        if username == _username and password == _password:
                            print("welcome login....")
                            user_status = True
                        else:
                            print("wrong username or password!")
                    if user_status == True:
                        return func(*args,**kwargs) # 看这里看这里,只要验证通过了,就调用相应功能
                else:
                    print("only support qq ")
            return inner #用户调用login时,只会返回inner的内存地址,下次再调用时加上()才会执行inner函数
        return auth
    
    @login("qq") #注意这里传入参数给装饰器外层
    def henan(t):
        print "henan********,%s" %t
    
    henan("henan args")

    运行结果

    user:alex
    pasword:abc!23
    welcome login....
    henan********,henan args

    应用场景一:登录验证

    优点:

      1、不会改变原先代码结构

      2、不会改变原先的调用方式

    参考:http://www.cnblogs.com/alex3714/articles/5765046.html

  • 相关阅读:
    二叉树中序遍历的非递归实现
    求树的遍历、树的叶子节点个数、树的高度、copy树
    javascript知识点汇总(running)
    IOS零碎知识点(积累中)
    Cuda learn record three
    Cuda learn record two
    找出字符串中的最长的回文子串
    Cuda learn record one
    Chrome 安装失败 错误代码 0X80070057
    Vs 2015 项目中include 无法打开源文件
  • 原文地址:https://www.cnblogs.com/kevincaptain/p/10442063.html
Copyright © 2020-2023  润新知