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'>)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

网络核心知识总结

计算机网络总结 基础 网络分层模型 OSI 七层模型是什么&#xff1f;每一层的作用是什么&#xff1f; OSI 体系结构是法律上的国家标准&#xff0c;从上往下讲分别是&#xff1a; 应用层 – 作用是 – 为计算机用户提供服务表示层 – 作用是 – 数据处理(编解码、加密解密、…

【数据结构】八大排序 (三)

目录 前言&#xff1a; 快速排序 快速排序非递归实现 快速排序特性总结 归并排序 归并排序的代码实现 归并排序的特性总结 计数排序 计数排序的代码实现 计数排序的特性总结 前言&#xff1a; 前文快速排序采用了递归实现&#xff0c;而递归会开辟函数栈帧&#xff0…

赴日开发做什么?日本签证很难拿?

日本的IT行业历史比较悠久&#xff0c;业务以上层前端业务为主&#xff0c;如设计和构建软件。日本IT公司组织庞大&#xff0c;行业内部有着严格的分工和部署&#xff0c;工作会被细分化。分配给个人的工作量不会太大&#xff0c;难度也不会很高。 在日本IT公司就业&#xff0…

【古月居《ros入门21讲》学习笔记】06_ROS常用命令行工具

目录 说明&#xff1a; 1. 回顾小海龟案例 终端1&#xff1a;启动ROS master 终端2&#xff1a;启动小海龟仿真器 终端3&#xff1a;启动海龟控制节点&#xff1a; 2. 系统计算图&#xff1a;rqt_graph 3. rosnode rosnode list&#xff1a;显示节点列表 rosnode info&…

LESS的叶绿素荧光模拟实现——任意波段荧光模拟

目录 前言一、任意波段荧光模拟的实现二、需要注意的输入参数 前言 此专栏默认您对LESS (LargE-Scale remote sensing data and image Simulation framework) 模型和叶绿素荧光(Sun-Induced chlorophyll Fluorescence, SIF)有一定的了解。当然&#xff0c;您也可以在这里下载中…

NCo3.1(08) - Nco3 服务器端编程

本篇博文不再重复ABAP调用外部服务器的基础&#xff0c;只介绍 NCo3 开发的过程和要点。需要了解相关知识点的小伙伴们自行参考&#xff1a; SAP接口编程 之JCo3.0系列(06) - Jco服务器端编程 PyRFC 服务器端编程要点 创建项目 新建一个 Console 项目&#xff0c;选择 .Net …

(亲测有效)解决windows11无法使用1500000波特率的问题

大家好&#xff01;我是编码小哥&#xff0c;欢迎关注&#xff0c;持续分享更多实用的编程经验和开发技巧&#xff0c;共同进步。 1、问题描述 从图1可以看出串口是正常的&#xff0c;安装的驱动是CP210xVCPInstaller_x64.exe&#xff0c;但是从图2可以看出&#xff0c;串口拒…

C# WPF 基础教程——触发器、行为、形状、变换与透明、路径和几何图形

触发器 简单触发器 单条件触发器 多条件触发器 事件触发器 行为 形状 矩形和椭圆 Viewbox缩放控件&#xff0c;直线&#xff0c;折线&#xff0c;多边形 画刷 普通画刷 线性渐变画刷 环形渐变画刷 位图画刷 虚拟画刷&#xff08;复制元素外观&#xff09; 位图缓存画刷 变换…

对二分搜索的理解 Go语言版

二分搜索大家都很熟悉&#xff0c;首先我们先来看看基本框架 func binarySearch(nums []int, target int) int {left, right : 0, ...for ... {mid : left (right-left)/2if nums[mid] target {...} else if nums[mid] < target {left ...} else if nums[mid] > targ…

探索测试开发工程师的通往成功的秘密路径!

「作者说」随着近几年国内IT行业高速发展&#xff0c;对测试工程师的要求也越来越高&#xff0c;其作用也越来越重要&#xff0c;但很多测试工程师也迎来了个人发展的瓶颈&#xff0c;下一步该向哪个方向发展&#xff0c;该如何发展&#xff1f;本文将概述测试工程师的现状及发…

使用MAT分析内存泄漏(mac)

前言 今天主要简单分享下Eclipse的Memory Analyzer在mac下的使用。 一、Mat&#xff08;简称&#xff09;干什么的&#xff1f; 就是分析java内存泄漏的工具。 二、使用步骤 1.下载 mac版的现在也分芯片&#xff0c;别下错了。我这里是M2芯片的&#xff0c;下载的Arch64的。 …

海康运行管理中心 RCE漏洞复现

0x01 产品简介 海康威视是以视频为核心的智能物联网解决方案和大数据服务提供商。海康运行管理中心是一款功能强大、易于使用的安防管理平台&#xff0c;能满足用户对视频监控、报警管理、设备配置和数据统计等方面的需求&#xff0c;帮助用户建立高效、智能的安防系统。 0x02…

tcpdump使用心得

参考原文 https://danielmiessler.com/p/tcpdump/ 几个用例 tcpdump -i eth0 显示eth0网卡当前所有的抓包情况eth0是网卡名&#xff0c;可以通过ifconfig获得&#xff0c;也可以通过 tcpdump -D 显示当前可以监听的网卡 -i 参数表示接口&#xff0c;后跟要监听的网卡 tcpdu…

MySQL 中的锁(三)

8.7. 死锁和空间锁 一般来说&#xff0c;只要有并发和加锁这两种情况的共同加持下&#xff0c;都会有死锁的身影。 死锁的具体成因&#xff0c;借用我们在并发编程中的内容&#xff1a; 8.7.1. 死锁 8.7.1.1. 概念 是指两个或两个以上的进程在执行过程中&#xff0c;由于竞…

二阶龙格塔库积分法求解混沌产生方程(求助)

最近论文中常常接触到激光产生混沌的方程&#xff0c;激光器作为非线性元件&#xff0c;在信息处理中具有非常大的潜力&#xff0c;其中激光产生混沌应用在通信中很有用处。论文中对于模拟数据部分&#xff0c;采用了以下公式来产生混沌&#xff1a;以此公式产生混沌的方法应用…

滴滴打车崩了!全过程

滴滴发布致歉10元补偿券&#xff0c;文末可领取 。 事情发生于 2023年11月27日晚~28日中午&#xff0c;滴滴打车服务出现大面积故障&#xff0c;登上微博热搜。 许多用户在使用滴滴出行时遇到了无法叫车、订单异常等问题&#xff0c;导致大量用户滞留在外&#xff0c;出行受阻…

基于Django+Tensorflow卷积神经网络鸟类识别系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介系统概述系统功能核心技术系统架构系统优势 二、功能三、系统四. 总结  总结 一项目简介 介绍一个基于DjangoTensorflow卷积神经网络鸟类识别系统是一个非…

Linux常用命令——rm 命令

文章目录 Linux系统中的rm命令是一个非常强大且危险的工具&#xff0c;用于删除文件和目录。由于其具有不可逆的特性&#xff0c;了解其参数和正确使用非常重要。 1. 基本用法 rm命令的基本格式是rm [选项] 文件或目录。不带任何选项时&#xff0c;rm命令仅删除文件。 示例&a…

Cytoscape软件下载、安装、插件学习[基础教程]

写在前面 今天分享的内容是自己遇到问题后&#xff0c;咨询社群里面的同学&#xff0c;帮忙解决的总结。 关于Cytoscape&#xff0c;对于做组学或生物信息学的同学基本是陌生的&#xff0c;可能有的同学用这个软件作图是非常溜的&#xff0c;做出来的网络图也是十分的好看&am…

【上海大学数字逻辑实验报告】二、组合电路(一)

一、 实验目的 熟悉TTL异或门构成逻辑电路的基本方式&#xff1b;熟悉组合电路的分析方法&#xff0c;测试组合逻辑电路的功能&#xff1b;掌握构造半加器和全加器的逻辑测试&#xff1b;学习使用可编程逻辑器件的开发工具 Quartus II设计电路。 二、 实验原理 异或门是数字…