在Python中进行面向对象编程时,类继承的熟练运用可以简化代码,增强软件的可维护性。下面,我们就看看类继承中那些有趣的事情。
1、单继承
单继承,即一个子类只有一个父类。在Python中,单继承结构是最常见的,也是最简单的,具体结构如下:
class 子类名(父类):
def __init(self):
pass
def method_n(self):
pass
在该结构中,子类继承父类,父类继承祖父类,直到最顶层的object类。
2、多继承
多继承,即一个子类可以有多个父类,它继承了多个父类的特性。具体结构如下:
class 子类名(父类1,父类2):
def __init(self):
pass
def method_n(self):
pass
一个子类继承多个父类,通常情况下简单地看成是单继承的组合,但是存在菱形继承这种特殊情况。
3、菱形继承
菱形继承又叫钻石继承,是多继承中的特殊情况,子类继承多个父类,而多个父类拥有共同的祖父类,具体结构如下:
class 祖父类名:
def __init(self):
pass
def method_n(self):
pass
class 父类2(祖父类):
def __init(self):
pass
def method_n(self):
pass
class 父类2名(祖父类):
def __init(self):
pass
def method_n(self):
pass
class 子类名(父类1,父类2):
def __init(self):
pass
def method_n(self):
pass
在Pycharm中使用类名调用父类方法的方式模拟下:
使用类名方法的菱形继承
在该代码中,在子类的__init__方法中,通过父类类名调用父类的__init__方法,有多少个父类就调用多少次,运行结果:
菱形继承运行结果
从运行结果中可以看出,尽管可以单继承中使用这种方式,但是在菱形继承中使用这种方式不是很合理,同一个祖父类Grandfather的__init__方法被调用了两次。我们知道,在Python中,子类中调用父类中的方法通常使用super()。super 是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题,但是如果使用多继承,会涉及到查找顺序(MRO)、重复调用(菱形继承)等种种问题。使用super将上述代码改造如下:
使用super的菱形继承
运行结果:
使用super后的菱形继承运行结果
可以看出,祖父类Grandfather的__init__方法只被调用了一次,这就是我们所需要的结果。
4、结束
为什么使用super后是这样的结果呢?这就需要提到一个叫做MRO的概念,MRO是"Method Resolution Order"的缩写,其实就是继承父类方法时的顺序表,类对象具备相对应的__mro__属性。类对象中的__mro__属性的值是Python通过C3算法计算出来的继承调用顺序,可以通过代码查看:
打印类对象的__mro__属性
运行结果:
Son类的__mro__
有了MRO,使用super时就能保证初始化时父类只被调用一次。
以上就是“写文章
点击打开何可ke的主页
Python中的菱形继承介绍”的全部内容,希望对你有所帮助。
关于Python技术储备
学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!
一、Python所有方向的学习路线
Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
二、Python必备开发工具
三、Python视频合集
观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
四、实战案例
光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
五、Python练习题
检查学习结果。
六、面试资料
我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
最后祝大家天天进步!!
上面这份完整版的Python全套学习资料已经上传至CSDN官方,朋友如果需要可以直接微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】。