题目
定义Student类,包括name、dob、age、gender和score属性,包括top3方法用来返回学生的最大的3个成绩(可重复)、sanitize方法用来将负的分数变为正的分数,负的分数可能是输入错误。声明stu_list对象组数用于存储所有的学生对象。最后输出所有的学生信息包括姓名、生日、年龄、性别、最高的3个分数。
数据如下:
stu1.txt 孙同学,2020-5-21,20,‘男’,77,56,77,76,92,58,-91,84,69,-91
stu2.txt 赵同学,2020-11-3,24,‘女’,65,68,72,95,-81,71,86,91,57,91
stu3.txt 王同学,2021-8-7,25,‘男’,87,78,90,-76,88,47,100,65,69,100
stu4.txt 李同学,2021-8-10,29,‘男’,92,54,85,71,-91,68,77,68,95,95
sumlist–我把所有文件按顺序放一个txt了,方便创建对象
第一题的输出结果如下,供参考:
分析:第一步建立类,定义构造函数,top函数等。第二步写读取文件的函数,边读取边新建对象。
编写输出函数。
#新建一个空列表,方便装对象
stu_list = []
class Student:
#新建学生类,第一个函数是构造函数,获取name等属性
def __init__(self, name, dob, age, gender, score):
self.name = name
self.dob = dob
self.age = age
self.gender = gender
self.score = score
#top函数比较复杂,用来输出最高的三个成绩。
def top3(self):
#读取文件时已经全部处理为列表了,所以直接for遍历,每次都用sanitize函数统一格式,随后用sorted函数排序
#sorted默认输出从小到大,所以输出倒三就是最高的三次成绩,注意,这里没有用set转集合,所以数据可以重复
return sorted([self.sanitize(t) for t in self.score])[-3:]
#sanitize函数把负分转换为正,正分则直接输出,注意,列表里储存的是字符串格式的score,得先转int才能比较
def sanitize(self, score):
score = int(score)
if score < 0:
return -score
else:
return score
#钟头好戏来了,为避免多次代码重复,并且为了提高代码的可拓展性
#从文件逐行读取数据,并创建对象,先用,分段为列表。然后pop挨个弹出即可。新建的对象append给提前准备的空列表
def creat(filename):
with open(filename,'r',encoding="utf-8") as f:
line = f.readline()
while line :
templ = line.strip().split(',')
stu_list.append(Student(templ.pop(0), templ.pop(0), templ.pop(0), templ.pop(0), templ))
line = f.readline()
creat('sumlist.txt')
#多次输出打包起来,方便后面循环执行
def print_student(student):
print(f'姓名:{student.name} 生日:{student.dob} 年龄:{student.age} 性别:{student.gender} 分数:{student.top3()}')
#一共四个数据循环四次即可0,1,2,3
for i in range(0, 4):
print_student(stu_list[i])
**
第二题
**
数据格式如下:
stu5.txt 特长同学,2020-10-5,20,‘男’,180,87,98,77,76,92,58,-76,84,69,-47
stu6.txt 特长同学,2020-10-6,20,‘女’,230,76,48,82,88,92,58,-91,84,69,-68
定义Spostudent、Artstudent为Student的子类,在子类的属性里面新增了spe为特长分数。Spostudent包括的top3方法返回的是最低的3个得分(可重复),Artstudent包括top3方法返回的是最高的3个得分(可重复),最后使用多态的方式输出2个特长同学的姓名、生日、年龄、性别、分数、特长分。
第二题的输出结果如下,供参考:
这题主要考继承和多态
先继承俩子类,然后其中一个要重写函数,另一个不变。
最后调用给父类编写的函数给俩子类,实现多态。(即运行子类的同名函数)
思路:先编写父类,然后继承的子类。最后运行,较为简单
def get_coach_data(filename):#新建两个不同的对象,所以只能一个一个来,不能像上面那样
with open(filename) as f:
line = f.readline()
return line.strip().split(',')
class Spostudent(Student):#继承父类,构造函数用父类的,在自己加一个spe即可
def __init__(self,name,dob,age,gender,spe,score):
Student.__init__(self,name,dob,age,gender,score)
self.spe=spe
def top3(self):#这个类要求最低的三个成绩,所以输出排序完的前三个就可以
return sorted([self.sanitize(t) for t in self.score])[:3]
class Artstudent(Student):#基本不变,就加个spe
def __init__(self,name,dob,age,gender,spe,score):
Student.__init__(self,name,dob,age,gender,score)
self.spe=spe
spe1=get_coach_data('work/stu5.txt')
spe2=get_coach_data('work/stu6.txt')
stu1=Spostudent(spe1.pop(0),spe1.pop(0),spe1.pop(0),spe1.pop(0),spe1.pop(0),spe1)
stu2=Artstudent(spe2.pop(0),spe2.pop(0),spe2.pop(0),spe2.pop(0),spe2.pop(0),spe2)
def print_student(student):#编写输出函数,此处注意,top3函数会按照我们的意愿执行,在调用时直接调用即可
print(f'姓名:{student.name} 生日:{student.dob} 年龄:{student.age} 性别:{student.gender} 分数:{student.top3()} 特长分:{student.spe}')
print_student(stu1)
print_student(stu2)
#两者的输出刚好相反,这就是多态
#stu1是调用重写过的top3输出最低成绩
#stu2是直接调用父类的top3函数
#之所以可以这么用是因为两者都是继承Student类,所以他们可以用父类的函数,或自己重写的同名函数
Student类两个代码段都是一个,想要运行第二段代码的话直接把类复制过来就可以