• 七.类的继承


    1.抽象基类

    • 起到固定方法(函数)的作用,不能实例化。
    • 派生类中被抽象的方法需要重写,否则永远不能实例化
    • 使用abc模块中ABC,@abstractmethod装饰器来标记为抽象:
      from abc import ABC,abstractmethod
      class A(ABC):
          @abstractmethod
          def func(self):
              pass
      class B(A):
          def func(self): #限定的抽象方法,必须被重写才可以实例化
              print("OK")
          pass
      b=B()
      b.func()

    2.新旧式类继承:

    #除非万不得已,否则应该避免用多重继承。
    #class base: #经典类
    class base(object):  #新式类
        def __init__(self,name):
            print("base:",name)
        def show(self):
            print("base show")
    class inherited(base):
        def __init__(self,name,age):
            #base.__init__(self,name)  #经典类写法
            super(inherited,self).__init__(name)     #新式类写法
            print("inherited:",name,age)
        def inshow(self):
            print("Inherited show")
    CI=inherited("ZhangYuan",34)
    
    #super是按照广度优先的顺序来寻找父类或兄弟类。super是根据拓扑结构整体来运算寻找的
    #一般如果新式类要使用super,父类都要加上super指向,这样防止错误。
    class A(object):
        def __init__(self):
            print("A")
    class B(A):
        def __init__(self):
            print("B")
            super(B,self).__init__()
        pass
    class C(A):
        def __init__(self):
            print("C")
            super(C,self).__init__()
        pass
    class F(A):
        def __init__(self):
            print("F")
            super(F,self).__init__()
        def showF(self):
            print("show F")
    class G(F):
        def __init__(self):
            print("G")
            super(G,self).__init__()
        pass
    class D(G,B,C):
        def __init__(self):
            print("D")
            super(D,self).__init__()
    testD=D()
    testG=G()
    print("----------------super功能挖掘------------------")
    #super(某类-->指向某类的下一个super,类实例-->实例决定了广度优先顺序的拓扑结构)
    #在多重继承中,super指向的是拓扑结构上顺序,不一定是父类,有可能是兄弟类
    super(G,testG).showF() #testG实例中,类G的super指向F
    super(G,testD).showF() #testD实例中,类G的super指向F
    super(B,testD).__init__() #testD实例中,类B的super指向C,再指向A
    print("----------------------------------")
    #旧式写法:根据深度优先(根据代码安排)
    class A_Old(object):
        def __init__(self):
            print("A_Old")
    class B_Old(A_Old):
        def __init__(self):
            print("B_Old")
            A_Old.__init__(self)
            #super().__init__()
        pass
    class C_Old(A_Old):
        def __init__(self):
            print("C_Old")
            A_Old.__init__(self)
            #super().__init__()
        pass
    class D_Old(B_Old,C_Old):
        def __init__(self):
            print("D_Old")
            B_Old.__init__(self)
            C_Old.__init__(self)
    test_Old=D_Old()

    3.Python3中多重继承原理:

    #Python3的多重继承中,继承的类有共同的基类:按照广度优先、从左到右寻找父类和兄弟类。继承的类没有共同基类:按照深度优先、从左到右寻找不同的父类
    class Base:
        def show(self):
            print("Base")
    class A(Base):
        pass
    class B(Base):
        def show(self):
            print("B")
    class C():
        def show(self):
            print("C")
    #D1继承的A、B都有继承共同基类,属于兄弟类,所以按照广度优先、从左到右
    class D1(A,B):
        pass
    d1=D1()
    d1.show() #B
    #D2继承的A、C没有共同基类,所以按照深度优先、从左到右
    class D2(A,C):
        pass
    d2=D2()
    d2.show() #Base
  • 相关阅读:
    Linux下串口编程入门
    arm-linux-gdb+gdbserver环境搭建以及远程调试
    google jib容器打包工具
    docker入门——构建镜像
    Docker搭建MySQL服务
    docker基本操作
    Docker 使用指南—— 基本操作
    使用docker Maven插件本地构建docker镜像并发布到远程服务器
    10张图带你深入理解Docker容器和镜像
    springboot+Jib+Maven+Idea+Docker 实践
  • 原文地址:https://www.cnblogs.com/i201102053/p/10623855.html
Copyright © 2020-2023  润新知