zoukankan      html  css  js  c++  java
  • 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('您输入的有非法字符,请从新输入')
    

      

     

  • 相关阅读:
    My Vim
    POJ 3292 Semi-prime H-numbers
    洛谷P3954 成绩【民间数据】
    数据结构—栈/队列
    说服式设计(persuasive design)的行为模型
    发送邮件给某人:mailto标签
    如何识别和利用用户情绪
    HDU Good Numbers (热身赛2)
    atlas z 轴
    什么叫“默认邮件客户端没有正确安装”?
  • 原文地址:https://www.cnblogs.com/jinfanfu/p/8747811.html
Copyright © 2011-2022 走看看