• 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

  • 相关阅读:
    vue axios的使用
    html5 css写出一个实心三角形和空心三角行
    弹出新页面并使整个旧页面背景变暗功能的实现代码
    radio 单选按钮 选中多个
    搭建脚手架cli2.x环境
    页面滚动条位置触发事件
    DataGridView行号发生变化 使用的事件
    eclipse git 忽略文件
    eclipse git 分享项目到GitHub上
    eclipse git 创建新分支 合并分支 删除分支
  • 原文地址:https://www.cnblogs.com/kevincaptain/p/10442063.html
Copyright © 2020-2023  润新知