多重继承
在现实生活中,在职研究生既是一名学生,又是一名职员,在职研究生同时具有学生和职员的特征,这种关系应用在面向对象程序设计上就是用多重继承来实现的,如下图所示。
多重继承指派生类可以同时继承多个基类,其语法格式如下:
class 基类1(object):
类体
class 基类2(object):
类体
class 派生类(基类1, 基类2):
类体
上述代码表示派生类继承自基类1与基类2,接下来演示如何定义多重继承,如下所示。
1 class Student(object):
2 def __init__(self, name, score):
3 self.name, self.score = name, score
4 def showStd(self):
5 print('姓名:', self.name, ' 分数:', self.score)
6 class Staff(object):
7 def __init__(self, id, salary):
8 self.id, self.salary = id, salary
9 def showStf(self):
10 print('ID:', self.id, ' 薪资:', self.salary)
11 class OnTheJobGraduate(Student, Staff):
12 def __init__(self, name, score, id, salary):
13 Student.__init__(self, name, score)
14 Staff.__init__(self, id, salary)
15 g1 = OnTheJobGraduate('隼与鱼', 100, '110', 10000)
16 g1.showStd()
17 g1.showStf()
运行结果如下图所示。
在上例中,派生类OnTheJobGraduate继承自基类Student与Staff,则派生类同时拥有两个基类的公有成员。第12行在派生类中定义构造方法并调用两个基类的构造方法,第15行创建派生类实例对象并对其属性进行初始化。
在多重继承中,如果派生类中存在与基类同名的方法,Python按照继承顺序从左到右在基类中搜索方法,如下所示。
1 class Student(object):
2 def __init__(self, name, score):
3 self.name, self.score = name, score
4 print('Student类', self.name)
5 def show(self):
6 print('姓名:', self.name, ' 分数:', self.score)
7 class Staff(object):
8 def __init__(self, name, salary):
9 self.name, self.salary = name, salary
10 print('Staff类', self.name)
11 def show(self):
12 print('姓名:', self.name, ' 薪资:', self.salary)
13 class OnTheJobGraduate(Student, Staff):
14 def __init__(self, name1, score, name2, salary):
15 Student.__init__(self, name1, score)
16 Staff.__init__(self, name2, salary)
17 g1 = OnTheJobGraduate('隼与鱼', 100, 'sunyuyu', 10000)
18 g1.show()
运行结果如下图所示。
在上例中,基类Student与Staff中存在相同的属性名与方法名,第18行派生类实例对象调用基类Student中的show()方法。此处大家需注意基类Student中show()方法输出self.name为'sunyuyu',而不是'隼与鱼',因为派生类调用构造方法时,先调用Student类中的构造方法,此时self.name为'隼与鱼',接着调用Staff类中的构造方法,此时会覆盖掉之前的内容,最终self.name为'sunyuyu'。
如果将上例中第13行代码中Student与Staff交换位置,具体如下所示:
class OnTheJobGraduate(Staff, Student):
再次运行程序,则运行结果如下图所示。