继承的详解

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

新式类和旧式类

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

Python - 面向对象编程 - 多继承的更多相关文章

  1. Python 面向对象编程 继承 和多态

    Python 面向对象编程 继承 和多态 一:多继承性 对于java我们熟悉的是一个类只能继承一个父类:但是对于C++ 一个子类可以有多个父亲,同样对于 Python一个类也可以有多个父亲 格式: c ...

  2. Python面向对象编程——继承与派生

    Python面向对象编程--继承与派生 一.初始继承 1.什么是继承 继承指的是类与类之间的关系,是一种什么"是"什么的关系,继承的功能之一就是用来解决代码重用问题. 继承是一种创 ...

  3. python 面向对象编程学习

    1. 问题:将所有代码放入一个py文件:无法维护 方案:如果将代码才分放到多个py文件,好处: 1. 同一个名字的变量互相不影响 2.易于维护 3.引用模块: import module 2.包:解决 ...

  4. python面向对象编程进阶

    python面向对象编程进阶 一.isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 1 ...

  5. Python面向对象编程(下)

    本文主要通过几个实例介绍Python面向对象编程中的封装.继承.多态三大特性. 封装性 我们还是继续来看下上文中的例子,使用Student类创建一个对象,并修改对象的属性.代码如下: #-*- cod ...

  6. Python 面向对象编程基础

    Python 面向对象编程基础 虽然Pthon是解释性语言,但是Pthon可以进行面向对象开发,小到 脚本程序,大到3D游戏,Python都可以做到. 一类: 语法: class 类名: 类属性,方法 ...

  7. python面向对象编程学习

    python面向对象编程 基本概念理解 面向对象编程--Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作 ...

  8. 图解python | 面向对象编程

    作者:韩信子@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/56 本文地址:http://www.showmeai.tech/article-det ...

  9. python 面向对象编程(一)

    一.如何定义一个类 在进行python面向对象编程之前,先来了解几个术语:类,类对象,实例对象,属性,函数和方法. 类是对现实世界中一些事物的封装,定义一个类可以采用下面的方式来定义: class c ...

随机推荐

  1. Android开发在Activity外申请权限调用相机打开相册

    问题描述: 最近在项目中遇到一个需要调用相册和打开相机的需求,但是,在Android 6.0以后,调用相册属于危险权限,需要开发者动态获取,这就意味着我们申请权限是与Activity绑定的,但如果一个 ...

  2. CC2B本地环境搭建步骤及部署问题解决

    由于最近的项目是之前没接触过的netbeans+glassfish,记录一下最近在工作中搭建本地环境的步骤及遇到的一些问题解决方法: 1.配置java jdk 此过程中遇到一个问题就是在配置系统环境变 ...

  3. cJSON解析数据如何避免过多if-else,实现解耦

    代码展示: 数据接收函数内,解析cJSON数据时,一不小心就会冒出来一大堆if语句在一个函数内,后续想要新增网络功能时,必然又会导致需要在mqtt订阅函数内去新增部分代码,实现解析新的报文. 这显然耦 ...

  4. Couchdb 任意命令执行漏洞(CVE-2017-12636)

    影响版本:小于 1.7.0 以及 小于 2.1.1 该漏洞是需要登录用户方可触发,如果不知道目标管理员密码,可以利用CVE-2017-12635先增加一个管理员用户 依次执行如下请求即可触发任意命令执 ...

  5. js 跨域请求失败

    注:错误返回:Failed to load http://xxxxxxxxxxx: No 'Access-Control-Allow-Origin' header is present on the ...

  6. C++实现链表的相关基础操作

    链表的相关基础操作 # include <iostream> using namespace std; typedef struct LNode { int data; //结点的数据域 ...

  7. STM32启动代码分析及其汇编学习-ARM

    STM32 启动代码 Author By YuCloud 边看启动文件边学汇编 汇编 see ARM: Assembler User Guide see: https://blog.csdn.net/ ...

  8. 题解 Connect

    传送门 各种骗分无果,特殊性质还手残写挂了-- 首先完全图上直接输出边权 \(\times (n-2)\) 就行了,然而我脑残乘的 \(n-1\) 看数据范围肯定是状压,但是压边肯定炸了,考虑压点 因 ...

  9. docker-compose部署mysql,redis,rabbitmq

    version: '3' services: mysql: image: mysql:5.7.31 container_name: mysql restart: always command: --c ...

  10. Nginx-出现-403-Forbidden

    步骤一: 检查目录权限.权限不足的就加个权限吧. 例子:chmod -R 755 / var/www 步骤二: 打开nginx.conf 例子:vim /etc/nginx/nginx.conf 把 ...