Wrapper练习

为多个函数加上认证功能(用户账号密码来源于文件)

#编写装饰器,为多个函数加上认证功能(用户账号密码来源于文件)
#要求登陆成功一次,后续的函数都无序输入用户名密码
FLAG = 0

def login(f):
    def inner(*args, **kwargs):
        global FLAG
        if FLAG:
            ret = f(*args, **kwargs)
            return ret
        else:
            usr_name = input("请输入用户名:").strip()
            usr_psd = input("请输入密码:").strip().lower()
            with open('usr_info.txt', encoding='utf-8') as file_op:
                for line in file_op:
                    if usr_name == line.strip().split()[0]:
                        if usr_psd == line.strip().split()[1]:
                            FLAG = 1
                            break
                        else:
                            print("密码错误!")
                            break
                else:
                    print("无此用户!")
            if FLAG:
                ret = f(*args, **kwargs)
                return ret
            else:
                print("无效登录状态")
    return inner

@login
def index():
    print("This is the index page")

def in_number(f):
    def inner(*args, **kwargs):
        l1 = []
        l = input("输入数字:").split()
        for i in l:
            l1.append(int(i))
        ret = f(*args,  *l1, **kwargs)
        return ret
    return inner

@login
@in_number
def plus(*args):
    count = 0
    for i in args:
        count += i
    return count


index()
print(plus(2, 5, 8))

 

编写装饰器,为多个函数加上记录功能

#编写装饰器,为多个函数加上记录功能,每次调用函数,都记录进文件
from functools import wraps
def txt_log(f):
    def inner(*args, **kwargs):
        ret = f(*args, **kwargs)
        with open("func_log.txt", mode='a', encoding='utf-8') as file_wr:
            file_wr.writelines("{}\n".format(f.__name__))
        return ret
    return inner

@txt_log
def main(a, b):
    return a + b

@txt_log
def show_index():
    print("This is a index page")

print(main(2, 3))
show_index()

 

实现缓存网页内容功能

#下载网页内容的函数,用户输入URL,函数返回下载页面的结果
#编写装饰器,实现缓存网页内容功能
#具体:下载的页面放于文件中,如果文件内有值,就优先从文件中读取,否则,去下载,存入文件

import urllib
import os
from urllib.request import urlopen


def cache_page(func):
    def inner(*args, **kwargs):
        if os.path.getsize('web_cache'):
            with open('web_cache', 'rb') as f:
                return f.read()
        ret = func(*args, **kwargs)
        with open('web_cache', 'wb') as f:
            f.write(ret)
        return ret
    return inner

def input_url(f):
    def inner(*args, **kwargs):
        url = input("输入网页地址:")
        ret = f(*args, url, **kwargs)
        return ret
    return inner

# @input_url
@cache_page
def get_page(*args, **kwargs):
    code = urlopen(*args).read()
    return code

print(get_page('http://www.baidu.com'))
print(get_page('http://www.baidu.com'))

 

posted @ 2020-03-30 16:20  vivagoal  阅读(111)  评论(0)    收藏  举报