#!/usr/bin/python3 # -*- coding: UTF-8 -*- """ @File:study.py @Description: 描述 @Author:yeqinfang @Email:yeqinfang@yeah.net @Date: 2020/05/14 """ # 1.实现网络要求超时重试的装饰,装饰以下功能函数 # 如果要求网络超时或连接超时,请求可以重新发送。如果重试三次后仍然加班,则抛出相应的异常 # # def request_http(url): # import requests # return requests.get(url, timeout=5) print("第一题答:") def tryAgain(func): num = 0 def wrapped(*args, **kwargs): nonlocal num try: return func(*args, **kwargs) except: if num<2: num = 1 return wrapped(*args, **kwargs) else: print("网络异常:重试三次后仍加班") # raise Exception("网络异常:重试三次后仍加班") return wrapped @tryAgain def request_http(url): import requests print("我出现的次数是要求的次数") return requests.get(url, timeout=5) request_http(url="http://www.baidu.com") # 2.请设计一个装饰器,接收一个int类型的参数number,可用于装饰任何函数, # 如果函数运行时间大于number,打印函数名和函数的运行时间 (面试真题) print("第二题答:") def timeLimit(number): import time def timeCount(func):
def wrapped(*args, **kwargs):
if not isinstance(number, int):
raise TypeError("参数number必须是int类型")
else:
startTime = time.time()
func(*args, **kwargs)
endTime = time.time()
if endTime - startTime > number :
print("{0}的运行时间为:{1}".format(func.__name__, endTime - startTime))
else:
pass
# print("运行正常")
return wrapped
return timeCount
@timeLimit(1)
def runTimes(n):
import time
time.sleep(n)
runTimes(2)
# 3、 请设计一个装饰器 ,可以给函数扩展登录认证的功能(提示数账号密码,然后进行校验),
# 多个函数同时使用这个装饰器, 调用函数的时候,只要登录成功一次,
# 后续的函数无需再进行登录(默认的认证账号:qwe123,密码:123456)
# (面试真题)
''' 编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件), 要求登录成功一次,后续的函数都无需再输入用户名和密码 '''
# 默认的认证账号:qwe123,密码:123456
user = {
'username':'qwe123', 'password':'123456'}
status = False
def login(func):
def wrapped():
global status
if not status:
username = input("username: ").strip()
password = input("password: ").strip()
if username==user["username"] and password==user["password"]:
print("登陆成功!")
status = True
func()
else:
print('请重新输入:')
else:
func()
return wrapped
@login
def func1():
import time
time.sleep(2)
print('我是func1,你看到了我,说明你已经登陆了系统')
@login
def func2():
import time
time.sleep(2)
print('我是func2,你看到了我,说明你已经登陆了系统')
func1()
func2()