装饰器练习题

写程序完成下列功能:(20分,有5分加分项,共计25分)

1),启动程序,首页面应该显示成如下格式:
    欢迎来到博客园首页
    1:请登录
    2:请注册
    3:文章页面
    4:日记页面
    5:评论页面
    6:收藏页面
    7:注销
    8:退出程序
2),用户输入选项,3~6选项必须在用户登录成功之后,才能访问成功。
3),用户选择登录,用户名密码从register文件中读取验证,三次机会,没成功则结束整个程 序运行,成功之后,可以选择访问3~6项,访问页面之前,必须要在log文件中打印日志, 日志格式为-->用户:xx 在xx年xx月xx日 执行了 %s函数,访问页面时,页面内容为:欢    迎xx用户访问评论(文章,日记,收藏)页面
4),如果用户没有注册,则可以选择注册,注册成功之后,可以自动完成登录(完成自动登录+5   分),然后进入首页选择。
5),注销用户是指注销用户的登录状态,使其在访问任何页面时,必须重新登录。
6),退出程序为结束整个程序运行。
mport time
dic = {
    'name':None,
    'flag':False
}  #字典内的这个flag充当着很重要的作用 它是所有语句的起点  用来判断的
#这个字典用来存储你注册或者登陆后的名字
#再定义一个标志位用来结束整个执行的过程的
flag1 = True



def func1(*args,**kwargs):  # 这个是登陆的信息
    num = 0
    while num < 3 :
        if args:  #这一步是为了判断你是否进行传参就是进行的登陆的操作
            dic['name'] = args[0]
            dic['flag'] = True
            return True  #为了让接下来的判断可以执行
        else:
            username = input('请输入您登陆的名字').strip()
            password = input('asd').strip() #不用int是因为你熊文件中读取出来也是字符的类型
            with open('register', encoding= 'UTF-8') as f :
                for line in f :
                    line_list = line.strip().split()
                    if username == line_list[0] and  password == line_list[1]:
                        print('登陆成功')
                        dic['name'] = username  #把信息写入字典内  以便于后面的调用
                        dic['flag'] = True
                        return True
                else :
                    print('登陆错误,请重新登陆,您还剩余%s次机会'%(2-num))
                    if num == 2 :break
                num += 1

def func2(*args,**kwargs):  #注册的功能
    flag =True
    while flag:
        username = input('请输入您要注册的信息').strip()
        with open('register', encoding = 'UTF-8', mode='r+')as f1:
            for i in f1 :
                l =i.strip().split()
                if username == l [0]:
                    print('您输入的信息已经在里面了 所以请您重新注册')
                    break #结束for  循环回到while循环语句
            else :
                password = input('请输入您注册的密码').strip()
                f1.write('\n{}\t{}'.format(username, password))  #把注册的信息写入register文件内
                print('恭喜您已经登陆成功 已经为您自动登陆了')
                return func1(username, password)  #因为注册成功后要自动登陆  所以我们要调用登陆的信息把注册名字密码传递进去

def wrapper(func):  #这个装饰器是用来判断你是否已经登陆了的,登陆过后的字典的flag会被改变 我们以这个为区分点
    def inner(*args,**kwargs):
        if dic['flag']:  # 这个是登陆成功后
            ret = func(*args,**kwargs)
            return ret
        else:
            print('请先进行登陆')
            if func1():  #这个是调用登陆的函数然后你登陆成功后把return  True返回回来后再执行下面的
                ret = func(*args, **kwargs)
                return ret

    return inner

def login(func): #这个是让你登陆后把你登陆的信息写入进去
    def inner(*args, **kwargs):
        struct_time = time.localtime()
        time_now = time.strftime("%Y-%m-%d %H:%M:%S", struct_time)
        with open('log',encoding = "UTF-8",mode = 'r+')as f:
            f.write('用户:{} 在{} 执行了 {}函数\n'.format(dic['name'], time_now,func.__name__))
            ret = func(*args,**kwargs)
            return ret

    return inner

@wrapper
@login
def func3():#文章页面
    print('欢迎%s访问文章页面' % dic['name'])


@wrapper
@login
def func4():#日记页面
    print('欢迎%s访问日记页面' % dic['name'])
@wrapper
@login
def func5():  #评论页面
    print('欢迎%s访问评论页面' % dic['name'])
@wrapper
@login
def func6():# 收藏
    print('欢迎%s访问收藏页面' % dic['name'])
@wrapper
@login
def func7():  #注销的页面
    print('这是注销的页面')
    dic['name'] = None
    dic['flag'] = False  #把所有的信息全部都设定为最开始为0  所有的 信息都不存在了
    print('注销成功')
@wrapper
@login
def func8():
    print('这个是退出')
    global flag1  #先把全局变量引用进来
    flag1 =False
    return  flag1 #还要把所有的信息都返还出去



choice_dic = {
    1:func1,
    2:func2,
    3:func3,
    4:func4,
    5:func5,
    6:func6,
    7:func7,
    8:func8
}
while flag1 :
    s = '''

      欢迎来到博客园首页
      1:请登录
      2:请注册
      3:文章页面
      4:日记页面
      5:评论页面
      6:收藏页面
      7:注销
      8:退出程序

      '''
    print(s)
    choice_num = input('请输入您要选择的序列号').strip()
    if choice_num.isdigit():
        choice_num = int(choice_num)
        if 0 <choice_num < len(choice_dic ):
            choice_dic[choice_num]()
        else :
            print('输入的超出范围请重新输入')
    else :
        print('您输入的有误请重新输入')

猜你喜欢

转载自my.oschina.net/u/3825370/blog/1793635
今日推荐