终于学完类与对象了,于是决定自己按照自己的思路偷摸的写一个,整整写了一天。过程中回看老师的代码,虽然不一样,逻辑略显混乱,但是整体应该没啥错的。在class Stu(object):和class Stu_mana(object):中局部单独执行都没有问题,组成一块就有问题了。本着在啰嗦的代码也是自己写的,遇到问题啃掉一个问题的精神,我要救活他!
主要问题是在类class Stu(object):中定义了一个添加方法def add_stu(self):,添加后要把数据放在一个列表中。那我去导入模块后根据类class Stu(object):创造的实例对象就是一个单个学生信息列表。但是这个列表作为参数在类class Stu_mana(object):中作为添加方法def add(self):的一个变量始终传递不过去。一直提示为空。
经过多方没方向的碰撞,原来由类创造的实例对象是不可迭代的。至少生成的列表、字典、元组应该如此!解决方案就是2种方法:
第一种:使用魔法方法__getitem__(self, index): 直接给这个不可迭代实例对象添加下标使得其成为可迭代对象。我认为最简单的形式。系统默认index从0开始。
def __getitem__(self, index):
return self.变量名[index]
第二种:使用魔法方法__iter__(self): \nnext(self):。这种方法没试过,以后试试看……
def __iter__(self): # 就是生成一个可迭代器
return self
def next(self): # 给容器里的元素添加下标
if self.i+1 <= len(self) # 下标数不能超过容器元素的个数
self.i += 1 # 下标数+1
return self.value[self.i]
_______________________以下是我乱写的面向对象的学生系统代码————————————
①建立第一个模块,内容是构建一个学生类,实现一个学生信息的添加,实例对象为一个列表,列表中保存一个学生的:学号、姓名、年龄、性别。
""" 学生类:1、传入学生的信息,学号,姓名,年龄,性别等保存到一个列表中 """ class Stu(object): def __init__(self): self.stu_list = [] def add_stu(self): code = input('请输入学生的学号,只能是3位数字:') # 做了学号优化,规定字符和长度 while len(code) != 3 or code.isdigit() != 1: code = input('请输入学生的学号,只能是3位数字:') self.stu_list.append(code) name = input('请输入学生的名字:') self.stu_list.append(name) age = input('请输入学生的年龄:') self.stu_list.append(age) sex = input('请输入学生的性别:') self.stu_list.append(sex) def __getitem__(self, i): # 对象是不可迭代,为了让对象迭代,网上搜索的方法,还有一个是 return self.stu_list[i] def __str__(self): return str(self.stu_list)
②建立第2个模块,内容是构建一个学生管理类,实现把一个个学生信息列表保存到一个大列表中,同时能够对这个大列表增删改查。
""" 系统管理类:1、利用Stu传递单个学生信息;2、把单个学生信息作为元素存入大列表中;3、显示功能菜单有增删改查可供选择 """ import Stu class Stu_mana(object): def __init__(self): self.infro_stu_list = [] @staticmethod # 静态方法不需要关联对象,所以不需要self def show_menu(): menu = ['1、添加学生', '2、删除学生', '3、修改学生信息', '4、查询单个学生信息', '5、查询所有学生信息', '6、退出系统'] for i in menu: print(i, end=' ') def add(self): # 增加功能 one_stu = Stu.Stu() one_stu.add_stu() list_stu = list(one_stu) for i in self.infro_stu_list: if i[0] == list_stu[0]: print("该学号对应学生信息已经录入,本次不会重复录入!如有问题请按照学号查询修改信息后重新录入!") return else: self.infro_stu_list.append(list_stu) def delete(self): # 增加功能 if len(self.infro_stu_list): del_code = input('请输入要删除学生的学号:') for i in self.infro_stu_list: if i[0] == del_code: self.infro_stu_list.remove(i) else: print('该学生尚未入库!请核对!') def change(self): # 增加功能 if len(self.infro_stu_list): del_code = input('请输入要修改学生的学号:') for i in self.infro_stu_list: if i[0] == del_code: code = input('请输入学生的学号:') i[0] = code name = input('请输入学生的名字:') i[1] = name age = input('请输入学生的年龄:') i[2] = age sex = input('请输入学生的性别:') i[3] = sex else: print('该学生尚未入库!请核对!') def check_one(self): # 查询所有学生 if len(self.infro_stu_list): check_code = input('请输入要查询学生的学号:') for i in self.infro_stu_list: if i[0] == check_code: return print(i) else: print('该学生尚未入库!请核对!') def check(self): # 查询所有学生 if len(self.infro_stu_list): for i in self.infro_stu_list: print(i) else: print('没有学生信息入库!请核对!') @staticmethod def quit(): # 查询所有学生 print('欢迎使用面向对象的学生系统!') def __str__(self): return str(self.infro_stu_list) def start(self): while True: # 主函数,也是整个项目框架 self.show_menu() choice = input('请输入操作编号:') if choice == '1': self.add() elif choice == '2': self.delete() elif choice == '3': self.change() elif choice == '4': self.check_one() elif choice == '5': self.check() elif choice == '6': self.quit() else: print('输入错误!')
③main主函数,这个真短啊……
""" 分析: 1、要有一个系统,可供学生信息录入、增删改查、存储-->系统管理类 2、学生信息:学生:学号,姓名,年龄,性别,可以以字典{}也可以以列表[]-->学生类 """ import Stu_mana # 导入模块2 test = Stu_mana.Stu_mana() # 用模块2中的类创建对象 test.start() # 启动程序