专栏名称: 隼与鱼
目录
相关文章推荐
史客郎  ·  近期尽量不要随便网购! ·  昨天  
史客郎  ·  近期尽量不要随便网购! ·  昨天  
Clinic門诊新视野  ·  会议预告丨1月6日-11日山东省微创心脏大血 ... ·  2 天前  
医学美图  ·  医学插画:把复杂的医学画出来 ·  4 天前  
51好读  ›  专栏  ›  隼与鱼

继承(多重继承)

隼与鱼  · 简书  ·  · 2019-03-29 08:44

正文

多重继承

在现实生活中,在职研究生既是一名学生,又是一名职员,在职研究生同时具有学生和职员的特征,这种关系应用在面向对象程序设计上就是用多重继承来实现的,如下图所示。


多重继承.png

多重继承指派生类可以同时继承多个基类,其语法格式如下:

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):

再次运行程序,则运行结果如下图所示。


运行结果