zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    抓取登录后的数据
    Form认证的几点说明
    eclipse启动错误:java.lang.NoClassDefFoundError: org/eclipse/core/resources/IContainer
    mysql游标的使用 No data
    mysql insert 主键 重复问题
    tail 命令
    maven 打包可执行jar的方法
    maven中如何打包源代码
    工程师,请优化你的代码
    在服务器端判断request来自Ajax请求(异步)还是传统请求(同步)
  • 原文地址:https://www.cnblogs.com/kevincaptain/p/10442063.html
Copyright © 2011-2022 走看看