【问题描述】
请定义一个班级管理类,类属性包含班级名称、班主任信息。首先向班级管理对象中添加班级名称、班主任姓名及学生信息,添加后输出班级信息;然后删除学号为“0002”的学生信息,并查找学号为“0001”的学生信息,完成操作后分别显示班级管理对象的信息。
输出结果:
(1)添加班级名称、班主任姓名及学生信息后的显示结果:
(2)删除0002号学生信息后的显示结果:
【题前思考】
根据问题描述,填写表6-1-4。
表6-1-4 问题分析
【解题思路】
通过分析得知,班级管理类中有学生pupils、班级clsname、班主任teacher 3个属性,需要对类做4个操作,添加学生进班级、显示学生信息、删除学生信息、查找学生信息。班级管理类的结构如图6-1-3所示。其中班级、班主任以参数的形式传入类,添加学生信息则是通过添加学生进班级的方法来完成操作。
图6-1-3 班级管理类ClassManager结构
【程序代码】
【代码分析】
①:从模块a6_1_1学生信息类中导入Student类,后续会使用到Student类创建学生对象。
②:定义类ClassManager。
③:定义方法__init__(self,clsname,teacher)。参数clsname表示班级,teacher表示班主任,这两个参数用于初始化对象属性self.clsname和self.teacher。创建对象时的参数对应关系如图6-1-4所示。属性self.__pupils初始化为空列表。
图6-1-4 创建对象时调用类的__init__( )方法
④:定义属性pupils用于访问私有属性self.__pupils,因为没有定义@setter.pupils修饰器修饰的方法,所以属性pupils是只读的。
⑤:定义方法add(self,sno,name,sex)添加学生信息。该方法通过调用Student(sno,name,sex,self.clsname)实例化学生对象,然后再调用self.pupils.append( )方法将学生对象追加到学生列表self.pupils。
⑥:定义方法remove(self,sno)删除学生信息。remove( )方法通过self.find(sno)方法根据学号sno从pupils找到sno对应的学生信息,再从列表self.pupils中删除该学生信息。
⑦:定义方法find(self,sno)根据学号sno查找学生信息。通过遍历self.pupils中的每一个项,将它们的sno属性与参数sno比较,如果找到则返回该学生对象,反之则返回空(None)。
⑧:定义方法show(self)显示该班级所有学生信息。print(f"{self.clsname+':'+self.teacher:^38s}")表示显示班级名称和教师姓名。print(f"{'学号':^8s}{'姓名':^6s}{'性别':^3s}{'班级':^20s}")表示显示表格的行标题信息,^8s表示占8个字符的位置,居中对齐。
⑨:创建班级管理对象,并完成要求的操作。
cls=ClassManager('2021级计算机1班','王老师')表示用ClassManager类创建班级管理对象cls,用于管理由王老师任班主任的2021级计算机班。
cls.add('0001','张磊','男')等3条语句调用cls的方法cls.add( )将学生添加到2021级计算机班。
调用cls的方法cls.show( )显示2021级计算机班学生信息。
调用cls的方法cls.remove('0002')从班级中删除学号为0002的学生。
调用cls的方法cls.find('0001')从班级中查找学号为0001的学生。如果查到,返回一个Student类的对象,然后再调用该学生对象的show( )方法,显示找到的学生信息。
【优化提升】
仔细查看代码,我们可以发现,在ClassManager类中,只定义了增加学生、删除学生、查找学生的方法,没有定义修改学生信息的方法。增、删、查、改这4个基本功能还差一个“改”。下面在类中使用魔法方法__getitem__( )和__setitem__( )完成修改功能。
定义了以上两个方法之后,就可以使用语句cls['0001'].show( )来显示学号为0001的学生信息,也可以使用语句cls['0001']={'name':'张五','sex':'女'}将学号为0001的学生姓名改为“张五”,将其性别改为“女”。从上例可以看出定义了__getitem__( )方法之后就可以使用“对象[下标]”的方法来读取对象信息,定义了__setitem__( )方法之后就可以用“对象[下标]=值”的方法来设置对象信息。
【技术全貌】
一个类可以通过定义具有特殊名称的方法来实现由特殊语法所引发的特定操作(如下标与切片),通常这些方法以双下划线(__)开头和结尾,称为魔法方法。基本的魔法方法见表6-1-5。容器类型的魔法方法见表6-1-6。例如,如果一个类定义了名为__getitem__( )的方法,并且x为该类的一个实例,则x[i]基本就等同于x.__getitem__(x,i)。如果想要查询更多的关于魔法方法的资料,请扫描二维码。
表6-1-5 基本的魔法方法
续表
续表
表6-1-6 容器类型的魔法方法