zoukankan      html  css  js  c++  java
  • 学生选课大作业

    两个版本 :

         写if 的可以写出来代码长 若多了 不适用

        写反射的可以极大的减少了代码且方便查看

    一点点拆分

    (共用的)管理员和用户登录模块

    # 出错点 # 之前 一直把他放里面和 if 构成一体  每一次执行 因为return 都会退出 for 循环 就不对
    def login(user,pwd):      #文件里的值(第三个写的好提供以后判断)  return随时跳出{字典}用的好  for else 好
        with open('userinfo', encoding='utf-8')as f:
            for line in f:
                username,password,ident  =  line.strip().split('|')
                # print(user , username , get_md5(user,pwd), password)    #这个可以用来判断对错
                if user == username and get_md5(user,pwd)==password:    #判断user不等 都不去判断密码
                    # if  里的 return 找到值了 返回+退出for循环
                    return {'result':True,'identify':ident,'username':username}  #默认返回元组 最好返回字典 更清晰
            else:              #返回result 做判断  返回username  做实例化  返回identify(值)对应的键 判断学生、管理员
                return {'result':False}
         #else 放在外面 和 for 构成一体  当for循环完后 还没有找到返回错误

    认证模块 return 用的也很好

    def auth():
        # opt_lst1 = [('登录', login), ('退出', exit)]
        opt_lst1 = ['登录', '退出']
        while True:
            for index , opt in enumerate(opt_lst1,1):
                print(index ,opt)
            num = int(input('请输入你做的操作:'))
            # ret = opt_lst1[num - 1][1]()            # opt_lst1[num-1][1]()       #执行  有可能是内置函数也有可能是login函数
            if num ==1 :
                user = input('username:')
                pwd = input('password:')
                ret = login(user,pwd)
                if ret['result']:
                    print('登录成功')
                    return ret
                else:
                    print('登录失败')
            elif num ==2:
                exit()

    小清晰的枚举 显示数字和功能

    class Manager:   #管理员用户
        opt_lst = ['创建课程', ' 给学生创建帐号 ', ' 查看所有课程','  查看所有学生]']
    for index, opt in enumerate(Manager.opt_lst,1):
        print(index , opt)

    只用if的版本

      类列表

    class Manager:   #管理员用户
        opt_lst = ['创建课程', ' 给学生创建帐号 ', ' 查看所有课程','  查看所有学生]']
    class Student:   #管理员用户
        opt_lst = ['创建课程', ' 给学生创建帐号 ', ' 查看所有课程','  查看所有学生]']

      判断登录者  判断执行功能的片段

        多次写判断登录者(每次都写) 多次判断执行各个函数(每次都写)

    if ret['result']:
        if ret['identify'] =='Manager':
            manager = Manager(ret['username'])
            print('1',manager)
            while True:
                for index, opt in enumerate(Manager.opt_lst,1):
                    print(index , opt)
                num = int(input('请选择您要操作的序号'))
                if num ==1:
                    manager.create_course()
                elif num == 2:
                    manager.create_student()    

    用反射方法

      类列表

    class Manager:   #管理员用户     # 不同  列表不同一方面显示 一方面反射  用了类反射 sys getattr(sys.[__modules__],ret['indentify'])
                    # 用了 不一样的 列表[输入数][1] 进行反射 反射的哥俩内容差不多 区别()
        opt_lst = [('创建课程', 'show_courses'), (' 给学生创建帐号', 'show_course'),
                   (' 查看所有课程', 'show_selected_course'), ('  查看所有学生]', 'choose_courses')
    class Student:   #管理员用户
        opt_lst = [('创建课程','show_courses'), (' 给学生创建帐号','show_course'),
                   (' 查看所有课程','show_selected_course'),('  查看所有学生]','choose_courses')]

      不必判断用户 传过来可以用 反射类方法 执行相应功能 

        用列表的索引值确定执行的方法

    if ret['result']:
        cls  = getattr(sys.modules[__name__],ret['identify'])
        obj = cls(ret['username'])
        while True:
            for index, opt in enumerate(Manager.opt_lst,1):
                print(index , opt[0])
            num = int(input('请选择您要操作的序号'))
            if hasattr(obj,cls.opt_lst[num-1][1]):
                getattr(obj,cls.opt_lst[num-1][1])()

    写入文件的固定值:

    liuyang|593c46524e137f0e5fdf58ffe03271b9|Manager
    wanger|4c051a1a81ed1e26d9a05e109da5a3dd|Student

    完整版的if 版

    import hashlib
    class Manager:
        opt = ['创建课程','创建学生','查看所有学生','查看所有课程']
        def __init__(self,name):
            self.name = name
        def create_course(self):
            print(self.name,'创建了课程')
        def create_student(self):
            print(self.name, '创建了学生')
        def show_course(self):
            print(self.name, '查看了课程')
        def show_student(self):
            print(self.name, '查看了学生')
        def quit(self):
            exit()
    class Student:
        opt = ['选择课程','创建','查看所有课程']
        def __init__(self,name):
            self.name = name
        def choose_course(self):
            print(self.name,'选择了课程')
        def create(self):
            print(self.name, '创建了')
        def show_course(self):
            print(self.name, '查看了课程')
        def quit(self):
            exit()
    def md5(user,pwd):
        md5 = hashlib.md5(user.encode('utf-8'))
        md5.update(pwd.encode('utf-8'))
        return md5.hexdigest()
    def login(user,pwd):
        with open('userinfo',encoding='utf-8') as f:
            for line in f:
                username , password , ident = line.strip().split('|')
                # print(username,user,password,md5(user,pwd))  #第二次写pwd 变量写错了 运行挺正常的
                if username == user and password == md5(user,pwd):
                    # print('匹配成功F')
                    return {'result':True,'manager':ident,'name':username}
            else:
                return {'result':False}       #挺棒的 提供多个判断条件
    def auth():
        while 1:
            log_opt = ['登录','退出']
            for index , log in enumerate(log_opt,1):
                print(index,log)
            num = int(input('请输入序号'))
            if num==1:
                user = input('user>>')
                pwd = input('pwd>>')
                ret = login(user,pwd)
                if ret['result']:
                    print('登录成功')
                    return ret
                else:
                    print('登录失败')
            if num==2:
                exit()
    ret = auth()
    if ret['result']:
        if ret['manager'] == 'Manager':
            while 1:
                manager = Manager(ret['name'])
                for index , log in enumerate(manager.opt,1):
                    print(index,log)
                num = int(input('请输入序号'))
                if num == 1:
                    manager.create_student()
                elif num == 2:
                    manager.create_course()
                elif num == 3:
                    manager.show_course()
                elif num == 4:
                    manager.show_student()
                else :
                    print('重新输入')
        if ret['manager'] == 'Student':
            while 1:
                student = Student(ret['name'])
                for index, log in enumerate(student.opt, 1):
                    print(index, log)
                num = int(input('请输入序号'))
                if num == 1:
                    student.show_course()
                elif num == 2:
                    student.choose_course()
                elif num == 3:
                    student.show_course()
                else:
                    print('重新输入')
    View Code

    完整版的反射版

    import hashlib
    class Manager:
        opt = [('创建课程','create_course'),('创建学生','create_student'),('查看所有学生','show_student'),('查看所有课程','show_course') ]
        def __init__(self,name):
            self.name = name
        def create_course(self):
            print(self.name,'创建了课程')
        def create_student(self):
            print(self.name, '创建了学生')
        def show_course(self):
            print(self.name, '查看了课程')
        def show_student(self):
            print(self.name, '查看了学生')
        def quit(self):
            exit()
    class Student:
        opt = [('选择课程','choose_course'),('创建了','create'),('查看课程','show_course') ]
        def __init__(self,name):
            self.name = name
        def choose_course(self):
            print(self.name,'选择了课程')
        def create(self):
            print(self.name, '创建了')
        def show_course(self):
            print(self.name, '查看了课程')
        def quit(self):
            exit()
    def md5(user,pwd):
        md5 = hashlib.md5(user.encode('utf-8'))
        md5.update(pwd.encode('utf-8'))
        return md5.hexdigest()
    def login(user,pwd):
        with open('userinfo',encoding='utf-8') as f:
            for line in f:
                username , password , ident = line.strip().split('|')
                # print(username,user,password,md5(user,pwd))  #第二次写pwd 变量写错了 运行挺正常的
                if username == user and password == md5(user,pwd):
                    # print('匹配成功F')
                    return {'result':True,'manager':ident,'name':username}
            else:
                return {'result':False}       #挺棒的 提供多个判断条件
    
    def auth():
        while 1:
            log_opt = ['登录','退出']
            for index , log in enumerate(log_opt,1):
                print(index,log)
            num = int(input('请输入序号'))
            if num==1:
                user = input('user>>')
                pwd = input('pwd>>')
                ret = login(user,pwd)
                if ret['result']:
                    print('登录成功')
                    return ret
                else:
                    print('登录失败')
            if num==2:
                exit()
    ret = auth()
    import sys
    if ret['result']:
        cls = getattr(sys.modules[__name__],ret['manager'])#忽然间 原来是个名 但是写不出 有提示.modules
        obj = cls(ret['name'])
        while 1:
            for index, opt1 in enumerate(obj.opt, 1):
                print(index, opt1[0])
            num = int(input('请输入序号'))
            if hasattr(obj,obj.opt[num-1][1]):
                getattr(obj,obj.opt[num-1][1])()
    View Code
  • 相关阅读:
    JavaScript递归函数解“汉诺塔”
    《JavaScript DOM编程艺术》学习笔记(三)
    《JavaScript DOM编程艺术》学习笔记(二)
    《JavaScript DOM编程艺术》学习笔记(一)
    《手把手教你实现电商网站开发》课程学习总结
    学校水卡、本地公交卡破解记
    第一篇博客
    mysql5.7.5以上版本使用distinct和order by 报错备忘录
    group_concat长度限制踩坑备忘录
    ArrayList、LinkedList、Vector的区别
  • 原文地址:https://www.cnblogs.com/Doner/p/10639856.html
Copyright © 2011-2022 走看看