内容正文:
任务7.2 继承和多态
7.2 继承和多态
父类子类的继承关系
多态的含义
7.2.1 继承
7.2.2 多态
7.2 继承和多态
7.2.1 继承
7.2.1 继承
通过继承创建的新类称为“派生类”或“子类”,被继承的类称为“基类”或“父类”。
通过继承创建的子类可继承父类的属性和方法,子类也可以重写父类的属性和方法,并且可自定义自身的属性和方法。
1.子类的定义
子类不能直接访问父类的私有属性和方法,但可以通过父类的公有成员方法访问父类的私有属性和方法。
7.2.1 继承
Person类
类变量:count
成员变量:name,age
成员方法:getInfo
类方法:ClassGetObject(cls)
N
Student类
类变量:count
成员变量:name,age,no,score
成员方法:getInfo,showInfo
类方法:ClassGetObject(cls)N
没有使用继承关系的类定义
Student类类需重新定义所有的属性和方法
Person类
类变量:count
成员变量:name,age
成员方法:getInfo
类方法:ClassGetObject(cls)
N
Student类
成员变量:no,score
成员方法:setScore
有继承关系的类定义
Student类定义自身特色的属性和方法,与父类相同的属性和方法继承父类
2.类的定义
7.2.1 继承
class Person():
count=0 # 父类类变量,对象总数
def __init__(self,name,age): # 父类构造方法
self.name=name # 父类成员变量,人名
self.age=age # 父类成员变量,年龄
Person.count+=1
def getInfo(self): # 父类普通成员方法,打印人的信息
print("%s年龄是%d。"%(self.name,self.age))
@classmethod
def classGetObject(cls): # 父类类方法
print("父类类方法classGetObject:已创建%d个对象。"%(cls.count)) #类内可通过cls访问类变量
【例7-12】父类及其子类的定义。
(1)父类Person定义
7.2.1 继承
class Student(Person):
def __init__(self,name,age,no): # 子类构造方法
super().__init__(name,age)
self.no=no
self.score=0
def showInfo(self,score): # 子类普通成员方法,设置本门课成绩
self.score=score
Person.getInfo(self)
print("%s同学的学号是%s,本门课成绩是%d。"%(self.name,self.no,self.score))
(2)子类Student的定义
在定义子类时,需要明确指出其父类名
调用父类构造方法初始化成员变量人名和年龄
子类的showInfo()方法调用了父类的getInfo()
7.2.1 继承
(1)在定义子类时,需要明确指出其父类名,其基本语法格式如下。
class.子类名(父类名)
class Student(Person):
def __init__(self,name,age,no): # 子类构造方法
super().__init__(name,age)
self.no=no
self.score=0
......
7.2.1 继承
(2)子类的属性(变量),其中的name、age与父类共用,因此这两个成员变量的初始化需要通过子类的_init__()方法调用父类的__init__()方法来完成。在调用时需指明父类名及相关的参数,基本格式如下:
supper().__init__(参数)
class Student(Person):
def __init__(self,name,age,no): # 子类构造方法
super().__init__(name,age)
self.no=no
self.score=0
......
7.2.1 继承
(3)在子类调用父类的方法时,同样需要指明父类名。基本格式如下:
父类名.父类方法(self,参数)
class Student(Person):
def __init__(self,name,age,no): # 子类构造方法
super().__init__(name,age)
def showInfo(self,score): # 子类普通成员方法,设置本门课成绩
self.score=score
Person.getInfo(self)
print("%s同学的学号是%s,本门课成绩是%d。"%(self.name,self.no,self.score))
7.2.1 继承
student1=Student('韩梅梅',18,'190404101') #创建对象
student1.showInfo(95) # 调用子类自身成员方法
student1.classGetObject() # 调用父类类成员方法,也可以用Person或Studet调用
Person.classGetObject()
Student.classGetObject()
【例7-13】父类、子类方法的调用。
韩梅梅年龄是18。
韩梅梅同学的学号是190404101,本门课成绩是95。
父类类方法classGetObject:已创建1个对象。
父类类方法classGetObject:已创建1个对象。
父类类方法classGetObject:已创建1个对象。
子类方法的调用参考“成员方法的调用”。父类方法的调用可以通过父类名、子类名、子类对象进行调用。
7.2.2 多态
7.2.2 多态
父类及其子类中的属性或方法使用了相同的名称,程序在调用这些属性或方法时,需确定调用哪个类下的属性和方法实现不同的功能,这就是类Python中的多态。
多态的概念
【例7-14】多态类定义。
class Person():
def __init__(self,name,age): #父类构造方法
self.name=name # 父类成员变量,人名
self.age=age # 父类成员变量,年龄
def getInfo(self): # 父类普通成员方法,与子类方法同名,打印人的信息
print("%s先生/女士年龄是%d。"%(self.name,self.age))
class Student(Person):
def __init__(self,name,age,no,score):
super().__init__(name,age)
self.no=no
self.score=score
def getInfo(self): # 子类普通成员方法,与父类方法同名,打印信息多多于父类
print("%s同学的学号是%s,年龄是%d,本门课成绩是%d。"%(self.name,self.no,self.age,self.score))
def showInfo(temp):
temp.getInfo() # 调用getInfo方法,该方法在父类、子类中都存在
在【例7-14】中,父类Person下有成员方法getInfo(),子类Student下也有getInfo()方法,但因为人的身份不同,所以这两个方法执行的功能(print内容)并不相同。现有类外函数showInfo()调用getInfo()方法。
7.2.2 多态
person1=Student('韩梅梅',18,'190404101',95) # 创建子类对象
person2=Person('韩商',45) # 创建父类对象
showInfo(person1)
showInfo(person2)
多态类的应用
韩梅梅同学的学号是190404101,年龄是18,本门课成绩是95。
韩商先生/女士年龄是45。
自动根据对象对应类调用相应对象所在类下的getInfo()方法。
函数showInfo自动调用子类Student类下的getInfo方法
函数showInfo自动调用父类Person类下的getInfo方法
【例7-14】多态类定义。
7.2.2 多态
边学边练:
请设计Python程序完成以下功能:
(1)创建一个动物类Animal,该类包括动物名称name、颜色color、年龄age三个属性,属性值在构造方法中完成初始化。还有一个打印该动物信息的getInfo()方法,将属性信息全部打印输出。
(2)创建一个子类Dog,该类继承自Animal类,添加一个品种category属性,其他属性继承自父类,属性值在构造方法中完成初始化。Dog类有一个getInfo()方法,将Dog类的属性信息全部打印输出。
(3)创建一个父类对象和一个子类对象,分别调用getInfo()方法进行对象信息的打印输出。
$$