zoukankan      html  css  js  c++  java
  • 面向对象之继承

    什么是继承:
    继承一种新建类的方式,新建的类称之为子类/派生类,被继承的类称之为父类基类超类


    python中继承的特点:
    1. 子类可以遗传/重用父类的属性
    2. python中一个子类可以同时继承多个父类
    3. 在继承背景下去说,python中的类分为两种:新式类,经典类
    新式类: 但凡继承了object的类Foo,以及该类的子类...都是新式类
    在python3中一个类即便是没有显式地继承任何类,默认就会继承object
    即python3中所有的类都是新式类

    经典类:没有继承object的类,以及该类的子类...都是经典类
    在python2中才区分新式类与经典类,
    在python2中一个类如果没有显式地继承任何类,也不会继承object


    为何要用继承:
    减少类与类之间代码冗余




    在子类派生的新方法中重用父类功能的方式:
    方式一:
     指名道姓地引用某一个类中的函数
    总结:
    1. 与继承无关
    2. 访问是类的函数,没有自动传值的效果
    方式二:
     在子类派生出的新方法中重用父类功能的方式二:super()必须在类中用
    在python2中:super(自己的类名,自己的对象)
    在python3中:super()
    调用该函数会得到一个特殊的对象,该对象专门用来访问父类中的属性,!!!完全参照mro列表!!!!
    总结:
    1. 严格依赖继承的mro列表
    2. 访问是绑定方法,有自动传值的效果


    属性的查找:
    单继承下:
     在单继承背景下属性的查找优先级:对象->对象的类->父类->父类.....

    多继承下:
     在多继承背景下属性的查找优先级:
    如果一个子类继承多个分支(多个分支没有共同继承一个非object的类)
    此时属性的查找优先级是:对象->对象的类->按照从左往右的顺序一个分支一个分支的找下去
     
    菱形继承问题:
    新式类 : 广度优先查找,从左往右一个分支一个分支的查找,在最后一个分支才去查找顶级类
    经典类 : 深度优先查找,从左往右一个分支一个分支的查找,在第一个分支就查找顶级类
     新式类(广度优先): obj->A->B->E->C-F->D->G->object
    经典类(深度优先): obj->A->B->E->G->C-F->D
     第四层:
    class G(object):
    # x = 'G'
    pass

    第三层
    class E(G):
    x = 'E'


    class F(G):
    x = 'F'


    第二层
    class B(E):
    x = 'B'


    class C(F):
    x = 'C'


    class D(G):
    x = 'D'


    第一层
    class A(B, C, D):
    x = 'A'






















  • 相关阅读:
    OpenGL(二十一) glPolygonOffset设置深度偏移解决z-fighting闪烁问题
    OpenGL(二十) glutSpecialFunc响应键盘方向控制键
    OpenGL(十九) gluOrtho2D、glViewport、glutInitWindowSize区别与关系
    matlab 三维图像的绘制
    matlab 三维图像的绘制
    UIKit和Core Graphics绘图(一)——字符串,线条,矩形,渐变
    jQuery实现密保互斥问题
    Lecture Halls
    POJ 3233 Matrix Power Series (矩阵+二分+二分)
    Wooden Sticks
  • 原文地址:https://www.cnblogs.com/zhangpang/p/9507218.html
Copyright © 2011-2022 走看看