python类的多重继承继承和查找顺序

1 python类的多重继承继承和查找顺序

python中,类的多重继承允许子类继承多个基类,子类可以访问多个基类的属性和方法。

1.1 多重继承基础

用法

class MulClass(BaseC1,BaseC2,...BaseCn):pass

描述

Mulclass:子类(或者称混合类),继承多个基类:BaseC1**,BaseC2,…**BaseCn

BaseCn:基类

在class语句首行括号内,填写一个以上的基类。此时,子类和其实例继承全部基类的所有变量。

示例

>>> class BaseC1:bc1='梯阅线条'
>>> class BaseC2:def bc2(self):print('BaseC2')
>>> class MulClass(BaseC1,BaseC2):pass
>>> mc=MulClass()
>>> mc.bc1
'梯阅线条'
>>> mc.bc2()
BaseC2

1.2 多重继承查找顺序

创建类的实例对象时自动调用类的__init__()方法,若未定义,则调用父类的__init__()方法。

1.2.1 经典类和新式类

描述

(1)新式类继承内置类型 (比如object,list,dict等),经典类不继承任何类。

(2)python2,定义类时,显式继承内置类型,则为新式类;定义类时,不继承任何类,则为经典类。

(3)python3,都为新式类,尽管没继承任何类也为新式类。

示例

python2

>>> class A:pass#经典类
>>> class B():pass#经典类
>>> class C(object):pass#新式类
>>> type(A);type(B);type(C)
<type 'classobj'>
<type 'classobj'>
<type 'type'>

python3

>>> class A:pass#新式类
>>> class B():pass#新式类
>>> class C(object):pass#新式类
>>> type(A);type(B);type(C)
<class 'type'>
<class 'type'>
<class 'type'>

1.2.2 优先查找左边

python继承多个基类时,优先查找左边的基类。

python2经典类

>>> class A:pass
>>> class B(A):def __init__(self):print('B')
>>> class C(A):def __init__(self):print('C')
>>> class D(B,C):pass
>>> d=D()
B

python2新式类

>>> class A(object):pass
>>> class B(A):def __init__(self):print('B')
>>> class C(A):def __init__(self):print('C')
>>> class D(B,C):pass
>>> d=D()
B

python3

>>> class A:pass
>>> class B(A):def __init__(self):print('B')  
>>> class C(A):def __init__(self):print('C')
>>> class D(B,C):pass
>>> d=D()
B

1.2.3 深度优先和广度优先

在这里插入图片描述

python多继承中,深度优先和广度优先是两种不同的查找策略。

如图,D继承B和C,B和C继承A。

深度优先查找:按D->B->A->C的顺序查找,如图中红线箭头。

广度优先查找:按D->B->C->A的顺序查找,如图中绿色箭头。

python2中,经典类按深度优先查找,新式类按广度优先查找。

python3中,都按广度优先查找。

1.2.4 python2查找顺序

python2中,类继承多个基类时,左边未找到时,

若为经典类,则按深度优先查找;

若为新式类,则按广度优先查找;

经典类

>>> class A:def __init__(self):print('A')
>>> class B(A):pass
>>> class C(A):def __init__(self):print('C')
>>> class D(B,C):pass
#查找顺序 D->B->A->C,DB没有,打印A
>>> d=D()
A
>>> class A:pass
>>> class B(A):pass
>>> class C(A):def __init__(self):print('C')
>>> class D(B,C):pass
#查找顺序 D->B->A->C,DBA没有,打印C
>>> d=D()
C

新式类

>>> class A(object):def __init__(self):print('A')  
>>> class B(A):pass
>>> class C(A):def __init__(self):print('C')
>>> class D(B,C):pass
#查找顺序 D->B->C->A,DB没有,打印C
>>> d=D()
C

1.2.5 python3查找顺序

python3中,类继承多个基类时,左边未找到时,都按广度优先查找。

未显示继承也为新式类

>>> class A:def __init__(self):print('A')
>>> class B(A):pass
>>> class C(A):def __init__(self):print('C')
>>> class D(B,C):pass
>>> d=D()
C

显示继承

>>> class A(object):def __init__(self):print('A')
>>> class B(A):pass
>>> class C(A):def __init__(self):print('C')
>>> class D(B,C):pass
>>> d=D()
C

1.3 mro方法解析顺序

描述

python3,通过类的__mro__属性(method resolution order 方法解析顺序),查看继承顺序。

python2,类没有__mro__属性。

示例

#python2 类无 __mro__ 属性
>>> class A:pass
>>> hasattr(A,'__mro__')
False
#python3 类有 __mro__ 属性
>>> class A:pass
>>> hasattr(A,'__mro__')
True
#python3 多重继承调用顺序
>>> class A:def __init__(self):print('A')
>>> class B(A):def __init__(self):print('B',end=' ')super().__init__()
>>> class C(A):def __init__(self):print('C',end=' ')super().__init__()
>>> class D(B,C):def __init__(self):print('D',end=' ')super().__init__()
>>> d=D()
D B C A
#python3 __mro__查看继承顺序
>>> print(D.__mro__)
(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>)

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode(36)旋转图像【矩阵】【中等】

目录 1.题目2.答案3.提交结果截图 链接&#xff1a; 48. 旋转图像 1.题目 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在** 原地** 旋转图像&#xff0c;这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 …

【01】侯小啾python入门计划_导语

侯小啾python入门计划_导语 欢迎大家订阅《侯小啾python入门计划》专栏&#xff0c;本专栏经作者侯小啾精心打造&#xff0c;极致把握初学者心理状态与困境&#xff0c;让小白少走弯路&#xff0c;让大佬快速成长。Python是一种简单易学且功能强大的编程语言。对于大多数非科班…

国密加密工业路由器 数据安全升级

国密加密工业路由器&#xff0c;简称国密加密路由器&#xff0c;是指遵循“商用密码管理规范”中规定的国家商用密码算法&#xff0c;采用国密加密芯片和密码算法的专业路由器。相比-般路由器&#xff0c;国密加密路由器具有更高级别的加密保护&#xff0c;可以有效提高数据传输…

什么是requestIdleCallback?和requestAnimationFrame有什么区别?

什么是requestIdleCallback? 我们都知道React 16实现了新的调度策略(Fiber), 新的调度策略提到的异步、可中断&#xff0c;其实就是基于浏览器的 requestIdleCallback和requestAnimationFrame两个API。 在 JavaScript 中&#xff0c;requestIdleCallback 是一个用于执行回调函…

ffmpeg 把mp4文件中某段视频转成gif文件

一 缘起背景&#xff1a; 有视频文件转gif动图的需求&#xff1b;网上下载的转换工具需要注册会员、否则带水印&#xff0c;还限制时长。 二 工具环境&#xff1a; win10 下 dos 操作 ffmpeg 三 操作命令&#xff1a; ffmpeg -i test.mp4 -ss 00:01:01 -t 00:00:19 -vf &q…

Mysql安全之基础合规

一、背景 某次某平台进行安全性符合型评估时&#xff0c;列出了数据库相关安全选项&#xff0c;本文特对此记录&#xff0c;以供备忘参考。 二、安全配置 2.1、数据库系统登录时的用户进行身份标识和鉴别&#xff1b; 1&#xff09;对登录Mysql系统用户的密码复杂度是否有要…

C++学习之路(十二)C++ 用Qt5实现一个工具箱(增加一个XML文本格式化功能)- 示例代码拆分讲解

上篇文章&#xff0c;我们用 Qt5 实现了在小工具箱中添加了《进制转换器功能》功能。为了继续丰富我们的工具箱&#xff0c;今天我们就再增加一个平时经常用到的功能吧&#xff0c;就是「 XML文本格式化 」功能。下面我们就来看看如何来规划开发一个这样的小功能并且添加到我们…

ESP32-Web-Server 实战编程- 使用 AJAX 自动更新网页内容

ESP32-Web-Server 实战编程- 使用 AJAX 自动更新网页内容 概述 什么是 AJAX &#xff1f; AJAX Asynchronous JavaScript and XML&#xff08;异步的 JavaScript 和 XML&#xff09;。 AJAX 是一种用于创建快速动态网页的技术。 传统的网页&#xff08;不使用 AJAX&#…

【动态规划】LeetCode2552:优化了6版的1324模式

本文涉及的基础知识点 C算法&#xff1a;前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 动态规划 本题其它解法 C前缀和算法的应用&#xff1a;统计上升四元组 类似题解法 包括题目及代码C二分查找算法&#xff1a;132 模式解法一枚举3C二分查找算法&am…

二叉树(判断是否为对称二叉树)

题目&#xff08;力扣&#xff09;&#xff1a; 观察题目&#xff0c;只需判断该二叉树是否对称。 判断二叉树是否对称&#xff0c;就可以换位去判断该二叉树的左子树和右子树是否对称。 这时就可以写一个辅助函数来方便判断。 该函数是判断两颗树是否镜像对称&#xff0c;这…

AppDelete 4.3.3(软件清理卸载工具)

AppDelete for Mac是一款运行在Mac平台上的强大软件卸载工具&#xff0c;AppDelete Mac版不仅可以删除应用程序&#xff0c;还可以删除小部件&#xff0c;首选项窗格&#xff0c;插件和屏幕保护程序及其相关文件&#xff0c;卸载快速又干净&#xff0c;仅需要简单的拖拽即可。 …

Swift 常用关键字

目录 一、数据类型 1. 流程控制 2. 访问控制 3. 功能修饰词 4. 错误处理 5. 泛型和类型 6. 其它关键字 二、部分关键字说明 1. guard 2. class 和 struct struct&#xff08;结构体&#xff09; class&#xff08;类&#xff09; 使用场景 3. mutating 4. proto…