python中,类的多重继承允许子类继承多个基类,子类可以访问多个基类的属性和方法。
用法
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
创建类的实例对象时自动调用类的__init__()方法,若未定义,则调用父类的__init__()方法。
描述
(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'>
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
python多继承中,深度优先和广度优先是两种不同的查找策略。
如图,D继承B和C,B和C继承A。
深度优先查找:按D->B->A->C的顺序查找,如图中红线箭头。
广度优先查找:按D->B->C->A的顺序查找,如图中绿色箭头。
python2中,经典类按深度优先查找,新式类按广度优先查找。
python3中,都按广度优先查找。
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
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
描述
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'>)