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

相关推荐

  1. python继承

    2023-12-06 22:54:02       39 阅读
  2. Python_封装继承

    2023-12-06 22:54:02       17 阅读
  3. python 继承、封装多态

    2023-12-06 22:54:02       33 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-06 22:54:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-06 22:54:02       100 阅读
  3. 在Django里面运行非项目文件

    2023-12-06 22:54:02       82 阅读
  4. Python语言-面向对象

    2023-12-06 22:54:02       91 阅读

热门阅读

  1. C实现的双向链表队列

    2023-12-06 22:54:02       51 阅读
  2. 算法----确定两个字符串是否接近

    2023-12-06 22:54:02       51 阅读
  3. React 列表页实现

    2023-12-06 22:54:02       62 阅读
  4. vue管理系统模版

    2023-12-06 22:54:02       65 阅读
  5. UVa1583生成元(Digit Generator)

    2023-12-06 22:54:02       53 阅读
  6. Python 模块的使用方法

    2023-12-06 22:54:02       65 阅读
  7. AIGC: 关于ChatGPT中基于Whisper模型实现音频转文本

    2023-12-06 22:54:02       57 阅读
  8. C语言词法陷阱

    2023-12-06 22:54:02       53 阅读