回顾
在Python进阶记录之基础篇(十七)中,我们介绍了Python面向对象中继承的基本概念和简单用法以及方法的重写和重载的相关知识点,今天我们讲一下Python面向对象中的多继承和多态。
多继承
多继承是指一个类继承两个或两个以上的父类,例如有类A、B、C,类C同时继承类A和类B,就说类C多继承了类A和类B,类C可以使用类A和类B中的属性和方法。
Python中支持多继承的形式,括号中填入要继承的父类,父类之间用逗号隔开。Python中多继承的基本写法如下。
class 子类(父类1, 父类2, ... , 父类n): pass
现在我们定义三个类A、B和C,并让类C同时继承类A和类B。
Python多继承
可以看到,类C既可以使用类A中的成员方法info_A( ),也能够使用类B中的成员方法info_B( )。这里需要注意的是,使用多继承时,调用父类的初始化方法__init__( )时,需要指明调用的是哪一个具体父类,而不能像单继承那样直接使用super关键字调用。
多继承可以让子类同时继承每个父类的属性和方法,那么,当父类之间具有相同名字的方法时,子类会怎么调用呢?我们修改一下上述代码,将类A中的成员方法info_A( )和类B中的成员方法info_B( )的方法名都修改为print_info。
父类之间有同名方法
可以看到,类C和类D都继承了类A、B,但当调用成员方法print_info( )时,类C调用的是类A中的print_info( ),而类D调用的是类B中的print_info( )。
事实上,若父类中有相同的方法名,而在子类使用时未指定,Python会在继承的父类中从左至右搜索,即方法在子类中未找到时,从左到右查找父类中是否包含方法,因此会优先调用在括号中排在前面的父类的方法。
若我们在不想改变继承顺序的同时,想优先调用类B中print_info( ),只需在子类中显式指定即可。
显式指定调用父类成员方法
多继承是有继承顺序的,即优先继承哪个类。
多态
之前已经介绍过面向对象三大特征中的封装和继承,那么什么是多态呢?多态是指同一种事物的多种形态。其实我们在之前内容中已经接触到了多态,方法的重写就是一种多态。
方法的重写
实现多态的步骤就是:1、定义子类。2、重写父类中的成员方法。3、子类调用自己的成员方法而不使用父类中的成员方法。
那么多态有什么用呢?我们在上述代码的基础上再增加一个子类Women,同样继承自Person,然后定义一个who_eat( )函数,该函数接受一个对象变量,功能是调用对象的成员方法eat( )。
多态的作用
可以看到,当我们给who_eat( )函数传入子类Men的对象时,调用的就是Men中的eat( )方法;传入子类Women的对象时,调用的就是Women中的eat( )方法。
这就是多态的好处。当多个继承自同一个类的子类中有相同名字的成员方法时,那么子类产生的对象就可以不必考虑具体的类型而直接调用方法。以上述代码为例,对于一个变量,我们只需要知道它是Person类型,而无需确切知道它的子类型,就可以放心地调用eat( )方法,而具体调用的eat( )方法是作用在Person、Men还是Women的对象上,由运行时该对象的确切类型决定,这就是多态真正的威力。
总结
以上内容介绍了Python面向对象中多继承和多态的相关知识点,需要重点掌握多继承的基本用法,注意多继承的继承顺序,理解多态的概念和意义。面向对象是一种编程思想,我们要理解它的精髓,才能更好地使用面向对象编程。感谢大家的支持与关注,欢迎一起学习交流~