Python学习基础笔记五十四——多继承

news2024/11/26 4:21:15

多继承中,我们子类对象调用的一个方法,默认是就近原则,找的顺序是什么?

在经典类中,是深度优先;

在新式类中,是广度优先;

Python2.7是经典类和新式类共存,新式类要继承object类。

Python3 只有新式类,默认继承object类。

经典类和新式类还有一个区别,mro方法只有在新式类中存在。

例1:

class A:
    pass
    # def func(self):
    #     print('A')


class B:
    pass
    # def func(self):
    #     print('B')


class C:
    def func(self):
        print('C')


class D(A, B, C):
    pass
    # def func(self):
    #     print('D')


d = D()
d.func()

2、钻石继承:

class A:
    def func(self): print('A')


class B(A):
    pass
    # def func(self): print('B')


class C(A):
    pass
    # def func(self): print('C')


class D(B, C):
    pass
    # def func(self): print('D')


d = D()
d.func()

说明:先找D,然后再找B,再找C,最后找A。

Python类可以继承多个类,Java和C#中则只能继承一个类。

Python类的如果继承了多个类,那么其寻找方法的方式有两种,分别是:深度优先和广度优先。

当类是新式类的时候,多继承情况下,会按照广度优先的方法查找。

经典类和新式类,从字面上可以看出一个老一个新,新的必然包含了更多的功能,也是之后推进的方法。从写法上区分的话,如果当前或者父类继承了object类,那么该类便是新式类,否则便是经典类。

3、广度优先算法:

4、小乌龟问题:

class F:
    def func(self): print('F')


class A(F):
    pass
    # def func(self): print('A')


class E(F):
    pass
    # def func(self): print('E')


class B(A):
    pass
    # def func(self): print('B')


class C(E):
    pass
    # def func(self): print('C')


class D(B, C):
    pass
    # def func(self): print('D')


d = D()
d.func()

 说明:是按顺序从B/A/C/E的顺序进行注释,验证小乌龟图的继承关系。

print(D.mro())

 

 说明:某个类的mro()方法和__mro__属性,可以查看到类的继承顺序关系。

5、继承原理:

Python到底是如何实现继承的,对于你定义的一个类, Python会计算出一个方法解析顺序(mro)列表,这个mro列表就是一个简单的所有的基类的线性顺序列表。

为了实现继承,Python会在MRO列表上从左到右开始查找基类,直到找到第一个匹配这个属性为止。

而这个MRO列表的构造是通过一个C3线性化算法实现的,它实际上就是合并所有父类的MRO列表并遵循如下三条准则。

1)子类会先于父类被检查;

2)多个父类会根据它们在列表中的顺序被检查;

3)如果对下一个类存在两个合法的选择,选择第一个父类。

6、总结:

继承的作用:

1)减少代码的重用;

2)提高代码的可读性;

3)规范编程模式;

几个名词:

1)抽象:抽象即抽取类似或者比较像的部分,是一个从具体到抽象的过程;

2)继承:子类继承了父类的属性和方法;

3)派生:子类在父类属性和方法的基础上产生了新的属性和方法;

钻石继承:

1)新式类:广度优先;

2)经典类:深度优先;

6、super的继承:

class A:
    def func(self): print('A')


class B(A):
    def func(self):
        super().func()       # 这个地方的super是C,不是父类,是整个结构的下一个节点
        print('B')


class C(A):
    def func(self):
        super().func()       # 这个地方的super是A
        print('C')


class D(B, C):
    def func(self):
        super().func()
        print('D')


d = D()
d.func()

super的本质,不是直接找父类,而是根据调用者的节点位置的广度优先顺序来的。

 

super的本质是不是应该是根据列表的从右到左的顺序执行的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/101851.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

领域模型设计模式

前言: 领域是一个组织所做的事情以及其包含的一切,通俗地说,就是组织的业务范围和做事情的方式,也是软件开发的目标范围。比如说淘宝的电商业务,C2C就是电子商务的领域,领域驱动设计就是从领域出发&#x…

安装VS code

五 安装VS Code Visual Studio Code,简称VS Code,是一种简化且高效的代码编辑器,同时支持诸如调试,任务执行和版本管理之类的开发操作。它的目标是提供一种快速的编码编译调试工具。优势: 支持多种语言的编写&#xf…

【大数据处理技术】「#1」本地数据集上传到数据仓库Hive

文章目录实验数据集下载下载实验数据集建立一个用于运行本案例的目录dbtaobao数据集的预处理删除文件第一行记录,即字段名称获取数据集中双11的前100000条数据导入数据仓库实验数据集下载 下载实验数据集 data_format.zip数据集用户行为日志user_log.csv&#xff…

jsp+ssm计算机毕业设计房屋租赁系统【附源码】

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: JSPSSM mybatis Maven等等组成,B/S模式 Mave…

node 使用 pm2 日志管理及使用 pm2-logrotate 进行日志分割

目录 1. 需求背景 2. 什么是 pm2-logrotate ? 3. 查看 pm2 自带的日志管理 4. 安装 pm2-logrotate 5. 查看配置指令 6. pm2-logrotate 具体配置说明 7. 如何设置这些值? 8. 停止 pm2-logrotate 服务 9. 补充:pm2 常用命令 1. 需求…

Java学习笔记 --- MySQL-函数

一、合计/统计函数 count Count返回行的总数 SELECT COUNT(*) 列名 FROM table_name WHERE where_definition # 演示 mysql 的统计函数的使用 -- 统计一个班级共有多少学生? SELECT COUNT(*) FROM student -- 统计数学成绩大于90的学生有多少个 SELECT COUNT(*) FR…

Linux——vim的使用

实验5 vim的使用 一、两种模式: 命令行模式和编辑模式(前者还有底行模式,命令行模式输入:就是底行模式) 切换方法:进入vim后默认在命令模式,可以通过输入a后者i进入编辑模式,或者…

SQL学习day3

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 高级过滤Q1、检索供应商名称Q2、检索并列出已订购产品的清单(稍难)Q3、返回所有价格在 3美元到 6美元之间的产品的名称和价格总结Q1、检索供应商名称 编写 SQL 语…

2022全年度吸尘器十大热门品牌销量榜单

近年来,随着社会经济的发展及人们生活水平的提升,吸尘器的市场需求得到不断地释放,行业规模也在不断扩大。但由于起步较晚,居民的消费能力尚未得到完全释放,目前我国吸尘器市场的渗透率还较低。 根据鲸参谋平台的数据统…

初识Go语言

Go是一种静态强类型、编译型、并发型语言。 一、Go语言的设计思维 尽可能少的方式去处理事情,减少选择的烦恼。 go的特点: 仅有25个关键字,简洁的语法内置垃圾回收器,大大降低程序员管理内存的负担去除隐式类型转换、去除指针…

UNIAPP实战项目笔记56 注册时验证手机号是否存在

UNIAPP实战项目笔记56 注册时验证手机号是否存在 注册时候需要拦截并验证登录 通过验证的直接跳转,未通过验证的提示手机号已存在 实际案例图片 后端接口文件 index.js var express require(express); var router express.Router(); var connection require(../db/sql.js);…

成端/接续功能使用说明

在nVisual系统中,接续/成端功能可以高效、准确、清晰的查看熔纤盒内的光纤连接情况。今天小编来给大家介绍一下成端和接续功能的使用。 一、成端 1. 功能入口 成端功能的入口有两种方式,第一个是鼠标右击选中线缆,出现连线右键菜单&#xf…

互联网新热——元宇宙带来了全新数字应用模式,推动数字经济的发展

大家平时电视上看到的在元宇宙中逛街、购物、社交,娱乐、看直播和表演……这些高度沉浸式地互动体验,都可以在“大唐灵境”实现了! 近日,太一集团与大唐不夜城联手打造的中国首个文旅电商元宇宙“大唐灵境”将正式开放“东市”商…

阿里云轻量级服务器部署了项目外网无法访问

阿里云轻量级服务器部署了项目外网无法访问1、问题描述2、配置安全组权限2.1、阿里云控制台权限配置(热加载,不用重启)2.2、在服务器中查看防火墙中有哪些端口被开放(非热加载,最后一定要手动重新加载)3、如…

MAC Python 虚拟环境配置方法parcharm

MAC Python 虚拟环境配置方法&parcharm一、安装环境包1.找个风水宝地2.安装virtualenv包二、创建虚拟环境1.对比记录2.创建虚拟环境启动虚拟环境1.启动命令2.环境对比三、退出虚拟环境四、pycharm使用虚拟环境1.打开parcharm,新建一个项目,起个名字。…

excel账龄计算:两个经典公式快速制作账龄统计表

财务工作者对于账龄统计表都不陌生,我们之前也分享过很多关于账龄统计表的操作技巧和公式解析,但是今天遇到的这种账龄统计表,还是让财务小姐姐犯了难,到底是个怎样的账龄统计表呢,一起来看看吧: 如图所示&…

【工厂方法模式-3】工厂方法模式的代码实现及使用场景

在前面我们学习了简单工厂模式,简单工厂模式适用于产品对象比较固定的使用场景。简单工厂模式工厂模式存在两个比较大的问题,一个是新产品的加入必须修改工厂类,违反了开闭原则;另一个是所有产品对象都与工厂类耦合,无…

校友录网站

开发工具(eclipse/idea/vscode等): 数据库(sqlite/mysql/sqlserver等): 功能模块(请用文字描述,至少200字):网站前台: 关于我们、联系我们、资讯信息、用户信息、用户动态、动态评论 管理员功能: 1、管理关…

基于vmdk文件创建虚拟机

基于vmdk文件创建虚拟机 1、准备vmdk文件 下载地址如下: 链接:https://pan.baidu.com/s/1coQuZw8cgg5oU5bSegsS7Q?pwd=5mv0 提取码:5mv0 账号/密码:root/sinzuo 2、创建虚拟机 选择自定义的方式创建虚拟机 硬件兼容性选择17,尽可能的向下兼容。 选择稍后安装操作系…

使用 IQR、Z-score、LOF 和 DBSCAN 进行异常值检测

你在处理异常值吗?哪种方法更适合检测偏斜或正态分布数据的异常值? 无论你是在执行 EDA 之前进行数据清理过程,将数据传递给机器学习模型,还是执行任何统计测试,本文都将帮助你获得许多此类问题的答案以及实际应用。 …