定义:
class 子类名(父类名):
情况1,如果子类有新增的属性,那么需要在子类__init方法中,调用父类的__init__
情况2,如果子类没有新增的属性,子类不需要写__init__方法
使用:
对象名 = 子类名(参数)
继承的好处:代码重用,升级功能(重写),新增功能(新的方法)
定义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
示例代码:
def get_coach_data(filename):
with open(filename) as f:
line = f.readline()
return line.strip().split(',')
stu1=get_coach_data('work/stu1.txt')
stu2=get_coach_data('work/stu2.txt')
stu3=get_coach_data('work/stu3.txt')
stu4=get_coach_data('work/stu4.txt')
class Student:
def __init__(self,a_name,a_dob,a_age,a_gender,a_score=[]):
self.name=a_name
self.dob=a_dob
self.age=a_age
self.gender=a_gender
self.score=a_score
def top3(self):
return sorted(set([self.sanitize(s) for s in self.score]),reverse=True)[0:3]
def sanitize(self,score_string):
if '-' in score_string:
score_string=abs(int(score_string))
else:
score_string=int(score_string)
return score_string
stu_1=Student(stu1.pop(0),stu1.pop(0),stu1.pop(0),stu1.pop(0),stu1)
stu_2=Student(stu2.pop(0),stu2.pop(0),stu2.pop(0),stu2.pop(0),stu2)
stu_3=Student(stu3.pop(0),stu3.pop(0),stu3.pop(0),stu3.pop(0),stu3)
stu_4=Student(stu4.pop(0),stu4.pop(0),stu4.pop(0),stu4.pop(0),stu4)
print('姓名: %s,生日: %s,年龄: %s,性别: %s,分数: %s'%(stu_1.name,stu_1.dob,stu_1.age,stu_1.gender,stu_1.top3()))
print('姓名: %s,生日: %s,年龄: %s,性别: %s,分数: %s'%(stu_2.name,stu_2.dob,stu_2.age,stu_2.gender,stu_2.top3()))
print('姓名: %s,生日: %s,年龄: %s,性别: %s,分数: %s'%(stu_3.name,stu_3.dob,stu_3.age,stu_3.gender,stu_3.top3()))
print('姓名: %s,生日: %s,年龄: %s,性别: %s,分数: %s'%(stu_4.name,stu_4.dob,stu_4.age,stu_4.gender,stu_4.top3()))
定义Spostudent、Artstudent为Student的子类,在子类的属性里面新增了spe为特长分数。Spostudent包括的top3方法返回的是最低的3个得分(可重复),Artstudent包括top3方法返回的是最高的3个得分(可重复),最后使用多态的方式输出2个特长同学的姓名、生日、年龄、性别、分数、特长分。
数据如下:
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
示例代码:
stu5=get_coach_data('work/stu5.txt')
stu6=get_coach_data('work/stu6.txt')
class SportStudent(Student):
def __init__(self,a_name,a_dob,a_age,a_gender,a_sport,a_score):
Student.__init__(self,a_name,a_dob,a_age,a_gender,a_score)
self.spe=a_sport
def top3(self):
return sorted(set([self.sanitize(s) for s in self.score]),reverse=False)[0:3]
class Artstudent(Student):
def __init__(self,a_name,a_dob,a_age,a_gender,a_art,a_score):
Student.__init__(self,a_name,a_dob,a_age,a_gender,a_score)
self.spe=a_art
stu_5=SportStudent(stu5.pop(0),stu5.pop(0),stu5.pop(0),stu5.pop(0),stu5.pop(0),stu5)
stu_6=Artstudent(stu6.pop(0),stu6.pop(0),stu6.pop(0),stu6.pop(0),stu6.pop(0),stu6)
def print_spe(Student):
print('姓名: %s,生日: %s,年龄: %s,性别: %s,分数: %s,特长分: %s'%(Student.name,Student.dob,Student.age,Student.gender,Student.top3(),Student.spe))
print_spe(stu_5)
print_spe(stu_6)
额外发现attention:父类构造函数有默认参数时,子类如果采用同样的默认格式可能没有想要的输出结果,这种情况下子类不应设置默认参数。
欢迎前来飞桨Paddle一起学习
课程链接:https://aistudio.baidu.com/aistudio/course/introduce/7073