内容正文:
项目九 继承与多态
Contents
继承的概念和实现
继承的概念和实现
super方法的使用
isinstance、issubclass和type的使用
什么是继承
PART 01
继承和多态是面向对象程序设计的另外两个重要特性
通过继承,可以基于已有类创建新的类,新类除了继承已有类的所有属性和方法,还可以根据需要增加新的属性和方法。
通过多态,可以使得在执行同一条语句时,能够根据实际使用的对象类型决定调用哪个方法。
继承与多态
4
继承允许开发者基于已有的类创建新的类
如果一个类C1通过继承已有类C而创建,则将C1称作子类(sub class),将C称做基类、父类或超类(base class、super class)。
子类会继承父类中定义的所有属性和方法,另外也能够在父类中增加新的属性和方法。
如果一个子类只有一个父类,则将这种继承关系称为单继承
如果一个子类有两个或更多父类,则将这种继承关系称为多重继承。
什么是继承
5
类的继承关系示例
单继承:父类Person,子类Student和Teacher
多重继承:父类Student和Teacher,子类TA
子类继承父类的属性和方法
子类可以增加新的属性和方法,对方法重新定义
什么是继承
6
如何继承父类
PART 02
class 子类名(父类名1, 父类名2, …, 父类名M):
语句1
语句2
…
语句N
定义子类时需要指定父类,其语法格式为:
当M等于1时,则为单继承;当M大于1时,则为多重继承。
如何继承父类
代码缩进 4个空格
正文缩进1.27厘米
8
如何继承父类
【任务描述】
了解如何继承父类
【关键步骤】
了解如何继承父类
示例01
代码缩进 4个空格
正文缩进1.27厘米
9
1 class Person: #定义Person类
2 def SetName(self, name): #定义SetName方法
3 self.name=name #将self对应对象的name属性赋为形参name的值
4 class Student(Person): #以Person类作为父类定义子类Student
5 def SetSno(self, sno): #定义SetSno方法
6 self.sno=sno #将self对应对象的sno属性赋为形参sno的值
7 class Teacher(Person): #以Person类作为父类定义子类Teacher
8 def SetTno(self, tno): #定义SetTno方法
9 self.tno=tno #将self对应对象的tno属性赋为形参tno的值
10 class TA(Student,Teacher): #以Student类和Teacher类作为父类定义子类TA
11 def SetTeacher(self, teacher): #定义SetTeacher方法
12 self.teacher=teacher #将self对象的teacher属性赋为形参teacher的值
如何继承父类
代码缩进 4个空格
正文缩进1.27厘米
10
13 if __name__=='__main__':
14 stu=Student() #定义Student类对象stu
15 stu.SetSno('1810100') #调用Student类中定义的SetSno方法
16 stu.SetName('李晓明') #调用Student类从Person类继承过来的SetName方法
17 print('学号:%s,姓名:%s'%(stu.sno,stu.name)) #输出学号和姓名
18 t=Teacher() #定义Teacher类对象t
19 t.SetTno('998012') #调用Teacher类中定义的SetTno方法
20 t.SetName('马红') #调用Teacher类从Person类继承过来的SetName方法
21 print('教工号:%s,姓名:%s'%(t.tno,t.name)) #输出教工号和姓名
22 ta=TA() #定义TA类对象t
23 ta.SetSno('1600125') #调用Student类中定义的SetSno方法
24 ta.SetTno('T18005') #调用Teacher类中定义的SetTno方法
25 ta.SetName('张刚') #调用Person类中定义的SetName方法
26 ta.SetTeacher('马红') #调用TA类中定义的SetTeacher方法
25 print('学号:%s,教工号:%s,姓名:%s,主讲教师:%s'%(ta.sno,ta.tno,ta.name,ta.teacher))
如何继承父类
示例01
代码缩进 4个空格
正文缩进1.27厘米
11
学号:1810100,姓名:李晓明
教工号:998012,姓名:马红
学号:1600125,教工号:T18005,姓名:张刚,主讲教师:马红
程序执行完毕后,将在屏幕上输出如下结果:
如何继承父类
示例01
代码缩进 4个空格
正文缩进1.27厘米
12
方法重写
PART 03
方法重写
【任务描述】
了解如何继承父类
【关键步骤】
了解如何继承父类
示例02
代码缩进 4个空格
正文缩进1.27厘米
14
1 class Person: #定义Person类
2 def __init__(self, name): #定义构造方法
3 self.name=name #将self对象的name属性赋为形参name的值
4 def PrintInfo(self): #定义PrintInfo方法
5 print('姓名:%s'%self.name)
6 class Student(Person): #以Person类作为父类定义子类Student
7 def __init__(self, sno, name): #定义构造方法
8 self.sno=sno #将self对象的sno属性赋为形参sno的值
9 self.name=name #将self对象的name属性赋为形参name的值
10 def PrintInfo(self): #定义PrintInfo方法
11 print('学号:%s,姓名:%s'%(self.sno,self.name))
12 def PrintPersonInfo(person): #定义普通函数PrintPersonInfo
13 print('PrintPersonInfo函数中的输出结果', end='#')
14 person.PrintInfo() #通过person调用PrintInfo方法
方法重写是指子类可以对从父类中继承过来的方法进行重新定义,使得子类对象可以表现出与父类对象不同的行为。
方法重写
示例02
代码缩进 4个空格
正文缩进1.27厘米
15
15 if __name__=='__main__':
16 p=Person('李晓明') #创建Person类对象p
17 stu=Student('1810100','李晓明') #创建Student类对象stu
18 p.PrintInfo()
19 stu.PrintInfo()
20 PrintPersonInfo(p)
21 PrintPersonInfo(stu)
姓名:李晓明
学号:1810100,姓名:李晓明
PrintPersonInfo函数中的输出结果#姓名:李晓明
PrintPersonInfo函数中的输出结果#学号:1810100,姓名:李晓明
程序执行完毕后,将在屏幕上输出如下结果:
方法重写
示例02
代码缩进 4个空格
正文缩进1.27厘米
16
super方法
PART 04
super([类名[, 对象名或类名]])
super方法用于获取父类的代理对象,以执行已在子类中被重写的父类方法,其语法格式为:
super方法有两个参数:第一个参数是要获取父类代理对象的类名。第二个参数如果传入对象名,则该对象所属的类必须是第一个参数指定的类或该类的子类,找到的父类对象的self会绑定到这个对象上;如果传入类名,则该类必须是第一个参数指定的类的子类。
在一个类A的定义中调用super方法时,可以将两个参数都省略,此时,super()等价于super(A, self),即获取A的父类代理对象,且获取到的父类代理对象中的self绑定到当前A类对象的self上。
super方法
代码缩进 4个空格
正文缩进1.27厘米
18
super方法
【任务描述】
了解super方法的用途
【关键步骤】
了解super方法的用途
示例03
代码缩进 4个空格
正文缩进1.27厘米
19
1 class Person: #定义Person类
2 def __init__(self, name): #定义构造方法
3 print('Person类构造方法被调用!')
4 self.name=name #将self对象的name属性赋为形参name的值
5 class Student(Person): #以Person类作为父类定义子类Student
6 def __init__(self, sno, name): #定义构造方法
7 print('Student类构造方法被调用!')
8 super().__init__(name) #调用父类的构造方法
9 self.sno=sno #将self对象的sno属性赋为形参sno的值
10 class Postgraduate(Student): #以Student类作为父类定义子类Postgraduate
11 def __init__(self, sno, name, tutor): #定义构造方法
12 print('Postgraduate类构造方法被调用!')
13 super().__init__(sno, name) #调用父类的构造方法
14 self.tutor=tutor #将self对象的tutor属性赋为形参tutor的值
15 if __name__=='__main__':
16 pg=Postgraduate('1810100','李晓明','马红') #创建Postgraduate类对象pg
17 print('学号:%s,姓名:%s,导师:%s'%(pg.sno,pg.name,pg.tutor))
super方法使用示例
super方法
示例03
代码缩进 4个空格
正文缩进1.27厘米
20
Postgraduate类构造方法被调用!
Student类构造方法被调用!
Person类构造方法被调用!
学号:1810100,姓名:李晓明,导师:马红
程序执行完毕后,将在屏幕上输出如下结果:
super方法
示例03
代码缩进 4个空格
正文缩进1.27厘米
21
isinstance、issubclass和type
PART 05
isinstance用于判断一个对象所属的类是否是指定类或指定类的子类;
issubclass用于判断一个类是否是另一个类的子类;
type用于获取一个对象所属的类。
内置函数isinstance、issubclass和type
23
isinstance、issubclass和type
【任务描述】
了解isinstance、issubclass和type方法的用途
【关键步骤】
了解isinstance、issubclass和type方法的用途
示例04
代码缩进 4个空格
正文缩进1.27厘米
24
1 class Person: #定义Person类
2 pass
3 class Student(Person): #以Person类作为父类定义子类Student
4 pass
5 class Flower: #定义Flower类
6 pass
7 if __name__=='__main__':
8 stu=Student() #创建Student类对象stu
9 f=Flower() #创建Flower对象f
10 print('stu是Person类或其子类对象:', isinstance(stu,Person))
11 print('stu是Student类或其子类对象:', isinstance(stu,Student))
12 print('f是Person类或其子类对象:', isinstance(f,Person))
13 print('Student是Person类的子类:', issubclass(Student,Person))
14 print('Flower是Person类的子类:', issubclass(Flower,Person))
15 print('stu对象所属的类:', type(stu))
16 print('f对象所属的类:', type(f))
17 print('stu是Person类对象:', type(stu)==Person)
18 print('stu是Student类对象:', type(stu)==Student)
isinstance、issubclass和type
示例04
代码缩进 4个空格
正文缩进1.27厘米
25
stu是Person类或其子类对象: True
stu是Student类或其子类对象: True
f是Person类或其子类对象: False
Student是Person类的子类: True
Flower是Person类的子类: False
stu对象所属的类: <class '__main__.Student'>
f对象所属的类: <class '__main__.Flower'>
stu是Person类对象: False
stu是Student类对象: True
程序执行完毕后,将在屏幕上输出如下结果:
isinstance、issubclass和type
示例04
代码缩进 4个空格
正文缩进1.27厘米
26
在OOP程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类、父类或超类(Base class、Super class)。继承最大的好处是子类获得了父类的全部功能。
调用父类及父类的父类的构造器
任务背景
任务01
调用父类及父类的父类的构造器
学习调用父类及父类的父类的构造器
任务需求
任务分析
建立Python项目
定义一个Animal类
定义两个Animal子类Horse和Donkey
定义另一个类Mule同时继承Horse和Donkey
任务01
借用Pycharm工具,建立Python3项目
定义一个Animal类
定义Animal类的子类Horse和Donkey
定义Mule类,同时继承Horse和Donkey
调用父类及父类的父类的构造器
任务步骤
任务结果
打印实例Mule,会依次打印他的父类Animal、Donkey、Horse
任务01
谢谢观看
$$