作业 7.21

一:编写函数,(函数执行时间用time.sleep(n)代表)

import time

def func():
    print('from func')
    time.sleep(1)

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

import time
from functools import wraps
def deco1(func1):
    @wraps(func1)
    def wrapper1(*args, **kwargs):
        start_time = time.time()
        res1 = func1(*args, **kwargs)
        end_time = time.time()
        print(f'{func1.__name__}的运行时间为{end_time - start_time}秒')
        return res1

    return wrapper1

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

import time
from functools import wraps
def deco2(func2):  
    @wraps(func2)
    def wrapper2(*args, **kwargs):
        inp_name = input('请输入您的用户名:').strip()
        inp_pwd = input('请输入您的密码:').strip()
        if inp_name == 'jason' and inp_pwd == '123':
            res = func2(*args, **kwargs)
            return res
        else:
            print('登录失败哦')

    return wrapper2

四:编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件),要求登录成功一次,后续的函数都无需再输入用户名和密码
注意:从文件中读出字符串形式的字典,可以用eval(’{“name”:“egon”,“password”:“123”}’)转成字典格式

login_user = None
db_dic = {}
login_time = 0


def login():  # 登录函数
    with open('db.txt', mode='r', encoding='utf-8') as f:
        for line in f:
            dic = eval(line)
            db_dic[dic['name']] = dic
    i = 0
    while i < 3:

        inp_name = input('请输入您的用户名:').strip()
        inp_pwd = input('请输入您的密码:').strip()
        if inp_name in db_dic:
            if inp_pwd == dic['inp_name']['password']:
                print('登录成功!')

                global login_time, login_user
                login_user = inp_name
                login_time = time.time()
                return
        else:
            print('登录失败!')
            i += 1


def deco3(func3):  # 认证
    @wraps(func3)
    def wrapper3(*args, **kwargs):
        while True:
            if not login_user:
                login()
            else:
                res3 = func3(*args, **kwargs)
                return res3

    return wrapper3

五:编写装饰器,为多个函数加上认证功能,要求登录成功一次,在超时时间内无需重复登录,超过了超时时间,则必须重新登录


import time
login_time = 0
def timer(func4):
    def wrapper4(*args, **kwargs):  # 登录计时
        global login_time
        flag = False
        while True:
            now_time = time.time()
            if now_time > (login_time + 3600):
                inp_name = input('请输入您的用户名:').strip()
                inp_pwd = input('请输入您的密码:').strip()
                with open('db.txt', mode='r', encoding='utf-8') as f:
                    for line in f:
                        name, pwd = line.strip('\n').split(':')
                        if inp_name == name and inp_pwd == pwd:
                            print('登录成功!')
                            flag = True

            else:
                res4 = func4(*args, **kwargs)
                return res4

            if flag:
                login_time = time.time()
            else:
                print('登录失败!请重新登录')

    return wrapper4

@timer
def home():
    print('===home===')

六:还记得我们用函数对象的概念,制作一个函数字典的操作吗,来来来,我们有更高大上的做法,在文件开头声明一个空字典,然后在每个函数前加上装饰器,完成自动添加到字典的操作

func_dic = {}
func_list = []


def deco5(func5):
    @wraps(func5)
    # 先判断函数名在不在字典,如不在,就添加
    def wrapper5(*args, **kwargs):
        # 收录所有字典里的函数名
        for v in func_dic.values():
            func_list.append(v)

        if func5.__name__ not in func_list:
            num = len(func_dic) + 1
            func_dic[str(num)] = func5.__name__
        res = func5(*args, **kwargs)
        return res

    return wrapper5


@deco5
def home():
    print('from home')


@deco5
def index():
    print('from index')


home()
index()
print(func_dic)

七:编写日志装饰器,实现功能如:一旦函数f1执行,则将消息2017-07-21 11:12:11 f1 run写入到日志文件中,日志文件路径可以指定
注意:时间格式的获取
import time
time.strftime(’%Y-%m-%d %X’)

import time
from functools import wraps


def log(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        with open('access.log', mode='a', encoding='utf-8') as f:
            f.write(f'{time.strftime("%Y-%m-%d %X")} {func.__name__} run\n')
            res = func(*args, **kwargs)
            return res

    return wrapper


@log
def home():
    print('====home====')


home()
time.sleep(1)
home()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值