• python:带参数的装饰器,函数的有用信息


    一、带参数的装饰器,函数的有用信息

    def func1():
        '''此函数的功能是完成的登陆的功能
        return: 返回值是登陆成功与否(true,false)
        '''
    
        print(333)
    
    func1()
    print(func1.__name__)#func1
    print(func1.__doc__)#此函数的功能是完成的登陆的功能,return: 返回值是登陆成功与否
    

       打印函数名

    from functools import wraps
    def wrapper(f):
        @wraps(f)
        def inner(*args,**kwargs):
            #函数运行之前的操作 ret = f(*args,**kwargs)
            #执行函数之后的操作 name = f.__name__ print(name) return ret return inner @wrapper def func1(): print(666) func1()

      二、带参数的装饰器

    给每个函数写一个记录日志的功能,

    功能要求:每一次调用函数之前,要将函数名称,时间节点记录到log的日志中。

    所需模块:

    import time
    struct_time = time.localtime()
    print(time.strftime("%Y-%m-%d %H:%M:%S",struct_time))

     

    import time
    def wrapper(func):
        def inner(*args,**kwargs):
            struct_time = time.localtime()
            time_now = time.strftime("%Y-%m-%d %H:%M:%S",struct_time)
            with open('log',encoding = 'utf-8',mode = 'a')as f:
                f.write('在%s时间,执行了%s函数
    '%(time_now,func.__name__))
                ret = func(*args,**kwargs)
                '''函数操作之后'''
                return ret
    
        return inner
    @wrapper
    def func1():
        print(6660)
    func1()
    

      

    在编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件),要求登录成功一次,后续的函数都无需再输入用户名和密码。这个作业之上进行升级操作:

          设置两套密码,一套为京东账号密码,一套为淘宝账号密码保存在文件中。

          设置四个函数,分别代表 京东首页,京东超市,淘宝首页,淘宝超市。

          循环打印四个选项:东首页,京东超市,淘宝首页,淘宝超市。

          供用户选择,用户输入选项后,执行该函数,四个函数都加上认证功能,只要登陆成功一次,在选择其他函数,后续都无需输入用户名和密码。

    相关提示:用带参数的装饰器。装饰器内部加入判断,验证不同的账户密码。

    dic = {
        'username':None,
        'status':False,
    }
    
    def login(flag):
        def wrapper(func):
            def inner(*args,**kwargs):
                if dic['status']:
                    ret = func(*args,**kwargs)
                    return ret
                else:
                    count  = 0
                    while count<3:
                        username = input('请输入你的用户名:').strip()
                        password = input('请输入你的密码').strip()
                        with open('msg2',encoding = 'utf-8')as f:
    
                            msg_dic= eval(f.readline())
    
                            if username == msg_dic[flag]['username'] and password == msg_dic[flag]['password']:
                                dic['username'] = username
                                dic['status'] = True
                                ret = func(*args,**kwargs)
                                return ret
                            else:
                                print('您输入的用户名或者密码错误,请从新输入,还有%s次机会' %(2-count))
                                count+= 1
            return inner
        return wrapper
    
    
    @login('微信')
    def taobao_home():
        print('淘宝首页')
    
    
    @login('qq')
    def JD_home():
        print('京东首页')
    
    
    
    choice_dict={
        1:taobao_home,
        2:JD_home,
    }
    
    while True:
        print('1  淘宝首页
    2 京东首页')
        choice_num = input('请选择输入的序号:').strip()
        if choice_num.isdigit():
            choice_num = int(choice_num)
            if 0 < choice_num <= len(choice_dict):
                choice_dict[choice_num]()
            else:
                print('请输入范围内的序号')
        else:
            print('您输入的有非法字符,请从新输入')
    

      

     

  • 相关阅读:
    所有程序员都是自学成才
    Xcode6模拟器路径
    Xcode7中模拟器的位置
    数据结构中的二级指针和引用
    02_线性表的链式表示和实现
    Spring 单例 httprequest 线程安全
    Springboot listener
    Spring单例 和 Scope注解
    红黑树
    线程池
  • 原文地址:https://www.cnblogs.com/jinfanfu/p/8747811.html
Copyright © 2020-2023  润新知