zoukankan      html  css  js  c++  java
  • 装饰器

    1. 编写函数,(函数执行的时间用time.sleep(n)模拟)

    import time
    
    
    def count_time():
        start = time.time()
        time.sleep(1)
        print('我是输出的内容!我要花费零点几毫秒的时间
    ')
        stop = time.time()
        print('函数一共运行时间为:', stop - start)
    
    
    count_time()

    2. 编写装饰器,为函数加上统计时间的功能

    import time
    
    
    def timer(func):
        def swapper(*args, **kwargs):
            start = time.time()
            res = func(*args, **kwargs)
            stop = time.time()
            print(stop - start)
            return res
    
        return swapper
    
    
    @timer
    def single():
        time.sleep(1)
        print('what are you waiting for?')
    
    
    single()

    3. 编写装饰器,为函数加上认证的功能

    import time
    
    
    def id(func):
        def wrapper(*args, **kwargs):
            account = input('account:').strip()
            password = input('password:').strip()
            if account == 'avery' and password == '123':
                res = func(account)
            else:
                print('wrong password')
        return wrapper
    
    
    @id
    def single(name):
        print('why are you waiting for %s?' % name)
        return 'fish'
    
    single('avery')

    4. 编写装饰器,为多个函数加上认证的功能

    # 用户的账号密码来源于文件,要求登录成功一次,后续的函数都无需再输入用户名和密码
    # 注意:从文件中读出字符串形式的字典,可以用eval('{"name":"egon","password":"123"}')转成字典格式
    
    import time
    
    login_user = {'name': None, 'start_time': None}
    
    
    def login(func):
        def wrapper(*args, **kwargs):
            if login_user['name']:  # 此段代码的精髓,经过一次登录后,后续函数无需再次验证用户名密码
                return func(*args, **kwargs)
            account = input('your account:').strip()
            code = input('your password:').strip()
            with open(r'db.txt', 'rt', encoding='utf-8') as f:
                for line in f:
                    line = line.strip()
                    # print(line,type(line))
                    user_dic = eval(line)
                    # print(user_dic,type(user_dic))
                    # user_dic = eval(user_dic)
                    # print(user_dic,type(user_dic))
                    if account in user_dic['name']:
                    # if account in user_dic:
                        if code == user_dic['password']:
                            # global login_user['name']
                            login_user['name'] = account
                            login_user['start_time'] = time.time()
                            return func(*args, **kwargs)
                        else:
                            print('Code err')
                            break
                else:
                    print('user is not find')
    
        return wrapper
    
    
    @login
    def index():
        time.sleep(1)
        print('Why are you waiting1 for %s' % login_user['name'])
    
    
    @login
    def home():
        time.sleep(2)
        print('Why are you waiting2 for %s' % login_user['name'])
    
    
    index()
    home()
  • 相关阅读:
    为什么使用enable_shared_from_this——shared_ptr两类错误
    More Effective C++ Item14:明智运用exception specifications
    用“双优先队列”方法解决双/多指标的规划问题
    彻底理解AC多模式匹配算法
    CentOS7安装MySQL
    CentOS7配置本地Yum源
    数组
    比较运算符
    申明变量
    相等运算符==与等同运算符===
  • 原文地址:https://www.cnblogs.com/avery-w/p/14193315.html
Copyright © 2011-2022 走看看