学生选课大作业
两个版本 :
写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('重新输入')
完整版的反射版
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])()