python是面向对象的语言,它支持多继承,即一个类可以继承多个父类的属性和方法。本书通过对代码的方式解读来解释多继承的概念,详见代码处注释部分。
# 3 显示调用父类的初始化方法,否则会出现属性不可用的异常
class Person(object): #加入object或者空
'''定义Person类,含name,age,gender属性'''
def __init__(self,name="Mike",age=20,gender='女'):
self.name=name
self.age = age
self.gender = gender
def getInfo(self):
print("{}有{}岁,是{}性".format(self.name,self.age,self.gender))
class Student(Person):
def __init__(self,name,age,gender,major,grade):
#super(Student,self).__init__()
#super().__init__(name,age,gender)
#super(Student,self).__init__() #仅在name,age,gender已经有默认值时不需要指定参数
super(Student, self).__init__(name,age,gender) # 仅Student可指定参数时需要传name,age,gender这三个参数
self.major = major
self.grade= grade
def getInfo(self):
print("{}就读于{}科的{}".format(self.name,self.major,self.grade))
if __name__ == '__main__':
s = Student('Tim',19,'女','数学','大二')
s.getInfo()
执行结果:
Tim就读于数学科的大二
## 4 多继承并初始化属性
class Person(object): #加入object或者空
'''定义Person类,含name,age,gender属性'''
def __init__(self,name="Mike",age=20,gender='女'):
self.name=name
self.age = age
self.gender = gender
def getInfo(self):
print("{}有{}岁,是{}性".format(self.name,self.age,self.gender))
class Student(Person):
def __init__(self,name,age,gender,major,grade):
#super(Student,self).__init__()
#super().__init__(name,age,gender)
#super(Student,self).__init__() #仅在name,age,gender已经有默认值时不需要指定参数
super(Student, self).__init__(name,age,gender) # 仅Student可指定参数时需要传name,age,gender这三个参数
self.major = major
self.grade= grade
def getInfo(self):
print("{}就读于{}科的{}".format(self.name,self.major,self.grade))
class Course():
def __init__(self,coureName,period ):
self.coureName=coureName
self.period= period
def getInfo(self):
print("{}持续{}".format(self.name,self.period ))
class Study(Student,Course):
def __init__(self,name,age,gender,major,grade,coureName,period):
Student.__init__(self,name,age,gender,major,grade)#父类Student初始化方法
Course.__init__(self,coureName,period)#父类Course初始化方法,object会被先后调用2次
def studyWith(self):
print("{}学习了{}".format(self.name,self.coureName))
if __name__ == '__main__':
sd = Study('Tim',19,'女','数学','大二',"英文","3周")
#print(Study.__mro__) #显示类的继承关系
sd.studyWith()
sd.getInfo()# Study未定义getInfo方法时会按照继承顺序调用父类的该方法,自左到右继承顺序
执行结果:
Tim学习了英文
Tim就读于数学科的大二