响应式 购物网站模板,福州网站建设出格,课堂网站开发,欧亚专线单号查询1 python类的多重继承继承和查找顺序
python中#xff0c;类的多重继承允许子类继承多个基类#xff0c;子类可以访问多个基类的属性和方法。
1.1 多重继承基础
用法
class MulClass(BaseC1,BaseC2,...BaseCn):pass描述
Mulclass#xff1a;子类#xff08;或者称混合…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):passmcMulClass()mc.bc1
梯阅线条mc.bc2()
BaseC21.2 多重继承查找顺序
创建类的实例对象时自动调用类的__init__()方法若未定义则调用父类的__init__()方法。
1.2.1 经典类和新式类
描述
1新式类继承内置类型 (比如objectlistdict等)经典类不继承任何类。
2python2定义类时显式继承内置类型则为新式类定义类时不继承任何类则为经典类。
3python3都为新式类尽管没继承任何类也为新式类。
示例
python2 class A:pass#经典类class B():pass#经典类class C(object):pass#新式类type(A);type(B);type(C)
type classobj
type classobj
type typepython3 class A:pass#新式类class B():pass#新式类class C(object):pass#新式类type(A);type(B);type(C)
class type
class type
class type1.2.2 优先查找左边
python继承多个基类时优先查找左边的基类。
python2经典类 class A:passclass B(A):def __init__(self):print(B)class C(A):def __init__(self):print(C)class D(B,C):passdD()
Bpython2新式类 class A(object):passclass B(A):def __init__(self):print(B)class C(A):def __init__(self):print(C)class D(B,C):passdD()
Bpython3 class A:passclass B(A):def __init__(self):print(B) class C(A):def __init__(self):print(C)class D(B,C):passdD()
B1.2.3 深度优先和广度优先 python多继承中深度优先和广度优先是两种不同的查找策略。
如图D继承B和CB和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):passclass C(A):def __init__(self):print(C)class D(B,C):pass
#查找顺序 D-B-A-CDB没有打印AdD()
Aclass A:passclass B(A):passclass C(A):def __init__(self):print(C)class D(B,C):pass
#查找顺序 D-B-A-CDBA没有打印CdD()
C新式类 class A(object):def __init__(self):print(A) class B(A):passclass C(A):def __init__(self):print(C)class D(B,C):pass
#查找顺序 D-B-C-ADB没有打印CdD()
C1.2.5 python3查找顺序
python3中类继承多个基类时左边未找到时都按广度优先查找。
未显示继承也为新式类 class A:def __init__(self):print(A)class B(A):passclass C(A):def __init__(self):print(C)class D(B,C):passdD()
C显示继承 class A(object):def __init__(self):print(A)class B(A):passclass C(A):def __init__(self):print(C)class D(B,C):passdD()
C1.3 mro方法解析顺序
描述
python3通过类的__mro__属性(method resolution order 方法解析顺序)查看继承顺序。
python2类没有__mro__属性。
示例
#python2 类无 __mro__ 属性class A:passhasattr(A,__mro__)
False
#python3 类有 __mro__ 属性class A:passhasattr(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__()dD()
D B C A
#python3 __mro__查看继承顺序print(D.__mro__)
(class __main__.D, class __main__.B, class __main__.C, class __main__.A, class object)