欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Python继承特性

程序员文章站 2022-09-13 23:12:14
Python支持多重继承,多重继承会出现一个问题:钻石型继承场景下的基类调用顺序和方法重载解析,多重继承可以解决接口实现机制。下面将详细介绍这种方式。Python是一门支持多继承的动态语言,这样在继承链的解析顺序时,需将多继承形成的图进行线性化,最后通过该线性化的顺序来决定调用的方法名称。Python语言关于继承的算法如下:L(C(X1,…,Xn)):类C的继承序列L(C(X1,…,Xn)) = C ∪ Merge(L(X1),L(X2),…,L(Xn),X1,…,Xn)Merge函数定...

Python支持多重继承,多重继承会出现一个问题:钻石型继承场景下的基类调用顺序和方法重载解析,多重继承可以解决接口实现机制。下面将详细介绍这种方式。

Python是一门支持多继承的动态语言,这样在继承链的解析顺序时,需将多继承形成的图进行线性化,最后通过该线性化的顺序来决定调用的方法名称。

Python语言关于继承的算法如下:

L(C(X1,…,Xn)):类C的继承序列

L(C(X1,…,Xn)) = C ∪ Merge(L(X1),L(X2),…,L(Xn),X1,…,Xn)

Merge函数定义如下:

Merge(L(X1),L(X2),…,L(Xn),X1,…,Xn):选择一个Xi满足以下条件:

i必须为继承链中的头元素且未出现在其他L(Xi)的尾部;

 如满足条件1,输出Xi,并删除该元素继续执行条件1;否则抛出异常

不同的是类A,B继承顺序不一样,实现代码如下:

class X(object):
    def show(self):
        print("X::show()")

class Y(object):
    def show(self):
        print("Y::show()")

class A(X,Y):
    def show(self):
        print("A::show()")

class B(Y,X):
    def show(self):
        print("B::show()")

class C(A,B):
    pass


if __name__ == "__main__":
    c = C()
    c.show()
print(c.__mro__)

 计算继承链如下:


L(X) = {object}
L(Y) = {object}
L(A(X,Y)) = A ∪ Merge(L(X),L(Y),X,Y)
  = {A} ∪ Merge(X,Y,{object},{object}})
  = {A,X,Y,object}
L(B(Y,X)) = B ∪ Merge(L(Y),L(X),Y,X)
   = {B} ∪ Merge(Y,X,{object},{ object})
   = {B,Y,X,object}
L(C(A,B)) = C ∪ Merge(L(A),L(B),A,B)
   = {C} ∪ Merge({A,X,Y,object},{B,Y,X,object},A,B)
   = {C,A,B} ∪ Merge({X,Y,object},{Y,X,object})

 多重继承情况下,在构造函数初始化时,采用super()方式来进行构造,如采用类名调用将导致同一构造函数多次继承多次被调用,且调用顺序取决于显示调用顺序。

class X(object):
    def __init__(self):
        super().__init__()
        print("X::init")
        self.value = 1

class Y(object):
    def __init__(self):
        super().__init__()
        print("Y::init")
        self.value = 2


class A(X,Y):
def __init__(self):
  //不建议采用X.__init__(self)、Y.__init__(self)
        super().__init__()
        print("A::init")
        self.value = 3

class B(Y,X):
    def __init__(self):
        super().__init__()
        print("B::init")
        self.value = 4


class C(B):
    def __init__(self):
        super().__init__()
        print("C::init")
        self.value = 5

 

本文地址:https://blog.csdn.net/LW65874258/article/details/107148642