Python - 面向对象编程 - 多继承

简介: Python - 面向对象编程 - 多继承

继承的详解


https://www.cnblogs.com/poloyy/p/15216652.html

这篇文章讲的都是单继承,Python 中还有多继承

 

Python 多继承的背景


  • 大部分面向对象的编程语言,都只支持单继承,即子类有且只能有一个父类
  • 而 Python 却支持多继承(C++也支持多继承)
  • 和单继承相比,多继承容易让代码逻辑复杂、思路换了一直备受争议,中小型项目中较少使用,后来的 Java、C#、PHP 取消了多继承
  • 多继承带来的问题:多个父类中包含同名的类方法
  • Python 的解决方案:根据子类继承多个父类时这些父类的前后次序决定,即排在前面父类中的类方法会覆盖排在后面父类中的同名类方法【后面文章详解】

 

什么是多继承


  • 子类可以拥有多个父亲,并且具有所有父类的属性和方法
  • 儿子可以拥有多个爸爸....爸爸也可以有多个儿子.....

 

语法格式

class 子类(父类1, 父类2, ...):

   pass

 

类图参考

image.png

实际代码

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,拥有了他们的所有属性和方法

 

多继承带来的顺序问题


问题的提出

如果不同的父类中存在同名的方法,子类对象在调用该方法时,会调用哪一个父类的方法呢?

 

重点注意

  • 正式开发中,如果需要用到多继承,那么多个父类应该避免使用同名的属性、方法
  • 如果父类存在同名的属性、方法,应该尽量避免使用多继承

 

类图

image.png

实际代码

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.cnblogs.com/poloyy/p/15223443.html

 

新式类和旧式类


https://www.cnblogs.com/poloyy/p/15226425.html


相关文章
|
1天前
|
Python
python基础篇:面向对象编程
python基础篇:面向对象编程
20 0
|
1天前
|
Python
【Python进阶(三)】——面向对象编程
【Python进阶(三)】——面向对象编程
|
1天前
|
Python
Python中的面向对象
【5月更文挑战第4天】面向对象编程(OOP)是Python的核心,涉及类与对象、封装、继承和多态。类是对象的模板,对象则是类的实例。例如,`Person`类有`__init__`构造方法和`greet`方法。
15 3
|
1天前
|
算法 Java 程序员
[重学Python] Day6 面向对象编程 基础
面向对象编程基础讲解,包括类与对象的概念,类是对象的模板,对象是类的实例。Python中使用`class`定义类,通过`__init__`初始化对象。创建对象并调用方法如`drive`和`target_client`。访问权限在Python中相对宽松,使用单下划线表示受保护的属性。面向对象的三大支柱是封装、继承和多态,封装是隐藏实现细节,仅暴露简单接口。提供了数字时钟和平面上的点的类定义作为练习示例。
14 0
|
1天前
|
算法 Python
Python面向对象oop编程(二)
Python面向对象oop编程(二)
|
1天前
|
运维 算法 Shell
第六章 Python类(面向对象编程)
第六章 Python类(面向对象编程)
|
1天前
|
Python
Python从入门到精通:深入学习面向对象编程——2.1.2继承、封装和多态的概念
Python从入门到精通:深入学习面向对象编程——2.1.2继承、封装和多态的概念
|
1天前
|
设计模式 算法 程序员
Python从入门到精通:2.1.3深入学习面向对象编程——设计模式的学习与实践
Python从入门到精通:2.1.3深入学习面向对象编程——设计模式的学习与实践
|
1天前
|
数据安全/隐私保护 Python
Python从入门到精通——2.2.1深入学习面向对象编程:类和对象的定义
Python从入门到精通——2.2.1深入学习面向对象编程:类和对象的定义
|
1天前
|
数据安全/隐私保护 Python
python基础之面向对象
面向对象编程(OOP)是一种以对象为中心的编程范式,通过对象和类实现现实世界的抽象。对象是程序的基本单元,类是对象的模板。主要特点包括:封装,通过访问修饰符隐藏对象内部细节,保证数据安全;继承,子类继承父类属性和方法,实现代码复用;多态,同方法调用在不同对象上产生不同行为,增强灵活性。示例代码展示了Python中的类定义、封装、继承和多态概念。