学生选课大作业

两个版本 :

     写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

 

posted @ 2019-04-01 22:56  learnacode  阅读(189)  评论(0编辑  收藏  举报