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类的多重继承继承和查找顺序_第1张图片

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

你可能感兴趣的:(python,python)