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

news/2024/4/17 7:33:41

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

https://www.xjx100.cn/news/3118823.html

相关文章

面试篇之微服务(二)

目录 服务容灾 21.什么是服务雪崩&#xff1f; 22.什么是服务熔断&#xff1f;什么是服务降级&#xff1f; 什么是服务熔断&#xff1f; 什么是服务降级&#xff1f; 有哪些熔断降级方案实现&#xff1f; 23.Hystrix怎么实现服务容错&#xff1f; 24.Sentinel怎么实现限…

如何在Rocky Linux中安装nmon

一、环境基础 [rootlocalhost nmon16d]# cat /etc/redhat-release Rocky Linux release 9.2 (Blue Onyx) [rootlocalhost nmon16d]# uname -r 5.14.0-284.11.1.el9_2.x86_64 [rootlocalhost nmon16d]# 二、安装步骤 在Rocky Linux和AlmaLinux等基于RHEL 的发行版上&#xff…

设计规则:模块化的力量

这是一本比较冷门的书**《设计规则&#xff1a;模块化的力量》**&#xff0c;虽然豆瓣上只有58个评价&#xff0c;但是确实能学到很多东西。 这本书对我非常深远。不是是投资&#xff0c;创业&#xff0c;还是其他领域&#xff0c;模块化思想都能帮上你。这本书告诉我们生万物…

Arkts@Watch装饰器与内置组件双向同步深度讲解与实战应用【鸿蒙专栏-14】

文章目录 ArkTS 状态管理深度解析:@Watch 和 $$ 运算符的妙用@Watch 装饰器:状态变量的敏感监听装饰器说明语法说明观察变化和行为表现限制条件使用场景$$ 运算符:内置组件状态的双向同步使用规则使用示例ArkTS 深度探索:@Watch 装饰器与 $$ 运算符的进阶应用进阶应用:@Wa…

Java数据结构之《合并线性表》问题

一、前言&#xff1a; 这是怀化学院的&#xff1a;Java数据结构中的一道难度中等偏下的一道编程题(此方法为博主自己研究&#xff0c;问题基本解决&#xff0c;若有bug欢迎下方评论提出意见&#xff0c;我会第一时间改进代码&#xff0c;谢谢&#xff01;) 后面其他编程题只要我…

使用Feign简化Spring Boot微服务间的调用

摘要&#xff1a; 在微服务架构中&#xff0c;服务间的通信是至关重要的。Spring Cloud提供了多种工具&#xff0c;其中Feign是一款声明式的Web服务客户端&#xff0c;能够显著简化服务调用的过程。本文将详细介绍在Spring Boot应用中如何使用Feign进行微服务之间的调用。 正文…

VR虚拟教育展厅,为教学领域开启创新之路

线上虚拟展厅是一项全新的展示技术&#xff0c;可以为参展者带来不一样的观展体验。传统的实体展览存在着空间限制、时间限制以及高昂的成本&#xff0c;因此对于教育领域来说&#xff0c;线上虚拟教育展厅的出现&#xff0c;可以对传统教育方式带来改革&#xff0c;凭借强大的…

【done】【重点】【回溯】【大数】剑指 Offer17:打印从1到最大的n位数

力扣 力扣中描述简单了&#xff0c;本质是考察大数算法。 1.大数 全排列 class Solution {public int[] countNumbers(int cnt) {char[] numArray {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};StringBuffer tmp new StringBuffer();List<String> res new ArrayList<>();…