• 装饰器练习


    # -*- coding=utf-8 -*-
    # !/usr/bin/env python3
    # -*- coding: utf-8 -*-
    # @Time : 2020/5/15 23:46
    # @Author : "小多肉"
    # @Email : 1021181701@qq.com
    
    """
    TODO:
    1、实现一个网络请求超时重试的装饰器,装饰下面的功能函数
    如果请求网络超时,或者连接超时,可以重新发送请求,如果重试三次之后,还是超时,抛出对应的异常
    
    def request_http(url):
        import requests
        return requests.get(url, timeout=5)
    
    2、请设计一个装饰器,接收一个int类型的参数number,可以用来装饰任何的函数, 
    如果函数运行的时间大于number,则打印出函数名和函数的运行时间 (面试真题)
    
    3、 请设计一个装饰器 ,可以给函数扩展登录认证的功能(提示数账号密码,然后进行校验),
    多个函数同时使用这个装饰器, 调用函数的时候,只要登录成功一次,
    后续的函数无需再进行登录(默认的认证账号:qwe123,密码:123456)
    (面试真题)
    """
    # ###########################第一题##################################
    
    
    def retry(fun):
        def wrapper(*args, **kwargs):
            for i in range(4):
                try:
                    res = fun(*args, **kwargs)
                except Exception as e:
                    if i == 0:
                        print(f"第一次请求失败!!!{e}
    正在尝试为您重新发起请求。")
                    else:
                        print(f"第{i}次重试……")
                        if i == 3:
                            raise e
                    continue
                else:
                    print("请求成功!!!", res)
                    break 
        return wrapper
    
    @retry
    def request_http(url):
        import requests
        return requests.get(url, timeout=5)
    
    # request_http("http://www.google.com.hk")
    print("---------------------第一题-------------------------")
    request_http("https://www.python.org/doc/")
    print("---------------------第一题异常情况-------------------------")
    try:
        request_http("http://www.google.com.hk")
    except Exception:
        print("重试三次都失败了,抛出异常。")
    
    # ############################第二题#################################
    """
    2、请设计一个装饰器,接收一个int类型的参数number,可以用来装饰任何的函数, 
    如果函数运行的时间大于number,则打印出函数名和函数的运行时间 (面试真题)
    """
    import time
    
    def performance(number):
        def decorator(fun):
            def wrapper(*args, **kwargs):
                start_time = time.time()
                print("-------start--------", start_time)
                fun(*args, **kwargs)
                end_time = time.time()
                print("-------end--------", end_time)
                dur_time = end_time - start_time
                if dur_time > number:
                    print(f"{fun.__name__}函数的运行时间为:{dur_time}")
            return wrapper
        return decorator
    
    @performance(0.1)
    def request_http2(url):
        import requests
        return requests.get(url)
    
    print("-------------------第二题---------------------------")
    request_http2("http://www.google.cn/")
    
    # ############################第三题#################################
    """
    3、 请设计一个装饰器 ,可以给函数扩展登录认证的功能(提示数账号密码,然后进行校验),
    多个函数同时使用这个装饰器, 调用函数的时候,只要登录成功一次,
    后续的函数无需再进行登录(默认的认证账号:qwe123,密码:123456)(面试真题)
    """
    LOGIN_FLAG = 0
    def login_check(func):
        def wrapper(*args, **kwargs):
            global LOGIN_FLAG
            if func.__name__ == "login":
                func()
            elif LOGIN_FLAG:
                func(*args, **kwargs)
            else:
                print("检测到您未成功登录,请先登录。")
        return wrapper
    
    @login_check
    def login():
        account = input("请输入账号:")
        password = input("请输入密码:")
        if account == "qwe123" and password == "123456":
            global LOGIN_FLAG
            LOGIN_FLAG = 1
        else:
            print("用户名或密码错误!登录失败!!!")
    
    @login_check
    def func1():
        print("函数1")
    
    @login_check
    def func2():
        print("函数2")
    
    @login_check
    def func3():
        print("函数3")
    
    print("------------第三题-----------")
    func1()
    login()
    func2()
    func3()
  • 相关阅读:
    [Angularjs]ng-switch用法
    [Asp.net Mvc]通过UrlHelper扩展为js,css静态文件添加版本号
    [转]支持高并发的IIS Web服务器常用设置
    [Redis]c# redis缓存辅助类
    [asp.net mvc]自定义filter
    [C#]exchange发送,收件箱操作类
    [bug]The file ‘/xxx/xxx.aspx’ has not been pre-compiled, and cannot be requested
    [Angularjs]自定义指令
    mycat介绍
    fdLocalSql使用方法
  • 原文地址:https://www.cnblogs.com/momoon/p/12892415.html
Copyright © 2020-2023  润新知