python面向对象的继承和多态,学生数据处理

题目

定义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个特长同学的姓名、生日、年龄、性别、分数、特长分。

第二题的输出结果如下,供参考:

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类两个代码段都是一个,想要运行第二段代码的话直接把类复制过来就可以

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值