Python - 面向对象编程 - 多继承
2021-09-05 09:47
597 查看
继承的详解
https://www.cnblogs.com/poloyy/p/15216652.html
这篇文章讲的都是单继承,Python 中还有多继承
Python 多继承的背景
- 大部分面向对象的编程语言,都只支持单继承,即子类有且只能有一个父类
- 而 Python 却支持多继承(C++也支持多继承)
- 和单继承相比,多继承容易让代码逻辑复杂、思路换了一直备受争议,中小型项目中较少使用,后来的 Java、C#、PHP 取消了多继承
- 多继承带来的问题:多个父类中包含同名的类方法
- Python 的解决方案:根据子类继承多个父类时这些父类的前后次序决定,即排在前面父类中的类方法会覆盖排在后面父类中的同名类方法【后面文章详解】
什么是多继承
- 子类可以拥有多个父亲,并且具有所有父类的属性和方法
- 儿子可以拥有多个爸爸....爸爸也可以有多个儿子.....
语法格式
class 子类(父类1, 父类2, ...): pass
类图参考
实际代码
class A: def test(self): print("test") class B: def demo(self): print("demo") class C(A, B): ... c = C() c.test() c.demo() # 输出结果 test demo
C 继承了 A、B,拥有了他们的所有属性和方法
多继承带来的顺序问题
问题的提出
如果不同的父类中存在同名的方法,子类对象在调用该方法时,会调用哪一个父类的方法呢?
重点注意
- 正式开发中,如果需要用到多继承,那么多个父类应该避免使用同名的属性、方法
- 如果父类存在同名的属性、方法,应该尽量避免使用多继承
类图
实际代码
class A: def test(self): print("AAA-test") def demo(self): print("AAA-demo") class B: def test(self): print("BBB-test") def demo(self): print("BBB-demo") class C(A, B): ... c = C() c.test() c.demo() # 输出结果 AAA-test AAA-demo
调用的是父类 A 的方法
如果 C 继承父类的顺序改变一下呢
# 刚刚是 A, B ; 现在是 B, A class C(B, A): ... c = C() c.test() c.demo() # 输出结果 BBB-test BBB-demo
- 现在变成调用父类 B 的方法了
- 这又是为什么呢?答案就是 Python 的 MRO 方法搜索顺序
Python 的 MRO 方法搜索顺序
https://www.cnblogs.com/poloyy/p/15226424.html
多继承结合 super() 的使用呢?
https://www.geek-share.com/detail/2841814820.html
新式类和旧式类
https://www.geek-share.com/detail/2841806420.html
相关文章推荐
- 洗礼灵魂,修炼python(34)--面向对象编程(4)—继承
- 洗礼灵魂,修炼python(35)--面向对象编程(5)—多重继承,组合
- python 面向对象编程封装、继承、多态的特性
- 麦子学院——Python面向对象编程(P9类的继承与方法重载)
- Python面向对象编程——类的继承
- python 面向对象编程_封装&继承&多态_栈与队列封装&乌龟吃鱼游戏
- Python 面向对象编程 继承 和多态
- Python(面向对象编程4——继承顺序、封装)
- Python之面向对象编程:封装、继承、多态
- Python 进阶_OOP 面向对象编程_组合与继承
- 【轻松学】Python面向对象编程——类的设计、基础语法、继承、多态、类属性和类方法、单例设计
- Py修行路 python基础 (十六)面向对象编程的 继承 多态与多态性 封装
- Python面向对象编程之继承与多态详解
- Py修行路 python基础 (十五)面向对象编程 继承 组合 接口和抽象类
- 1.6、Python(面向对象编程——2 继承、派生、组合、抽象类)
- 举例讲解Python面向对象编程中类的继承
- python3.x面向对象编程之继承
- 【Python3 笔记】Python3 面向对象编程 类与实例 继承多态 获取对象的信息
- 【2020Python修炼记】面向对象编程——继承
- Python面向对象编程之继承与多态详解