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

  • 相关阅读:
    函数输出参数 双重指针
    NotePad++ 支持日语字体
    C++ 前置操作符与后置操作符
    用js判断 iPhone6 iPhone6 plus iphonex?
    从浏览器输入一个地址到渲染出网页这个过程发生了什么???
    对.Net 垃圾回收Finalize 和Dispose的理解
    在.NET环境中使用单元测试工具NUnit
    信道
    asp.net 获取当前URL的正确方法
    ASP.NET中常用输出JS脚本的类
  • 原文地址:https://www.cnblogs.com/kevincaptain/p/10442063.html
Copyright © 2011-2022 走看看