zoukankan      html  css  js  c++  java
  • PYTHON-面向对象 继承 派生

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

    继承有3个特点:
    1. 子类可以遗传/重用父类的属性(解决类与类之间代码冗余的问题)
    2. 在python中一个子类可以同时继承多个父类
    3. 在继承的背景下,类分为两种:新式类,经典类
    新式类:但凡继承object类的子类,以及该子类的子子孙孙都是新式类
    在python3中一个类即便是没有显式地继承任何类,默认就继承object类,
    即在python3中所有类都是新式类
    经典类:没有继承object类的子类,以及该子类的子子孙孙都是经典类
    强调:只有在python2中才有经典类
    在python2中如果一个类没有显式地继承任何类,并不会自动继承object类

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

    3. 如何继承 :先抽象再继承
    # 在python中继承的特点?单继承(用一个父类)&多继承(用多个父类)

    x = 2
    class Foo:
    x = 1
    pass
    obj = Foo()
    obj.x = 3

    print(obj.x)

    4. 属性查找
    在没有出现菱形继承的情况下,属性的查找是按照从左往右的顺序一个分支一个分支的找下去
    在单继承背景下,无论是新式类还是经典类属性查找顺序都一样
    先obj->类->父类->...

    在出现菱形继承(一个子类继承的多个分支最终汇聚到一个非object类)的情况下,
    在多继承背景下,如果一个子类继承了多个分支,但是多个分支最终汇聚到一个非object类(菱形继承问题)
    面试常问问题*****
    新式类(.mro()):广度优先查找,按照从左往右的顺序一个分支一个分支的找下去,在最后一个分支才去查找顶级类
    obj->A->B->E->C->F->D->G->object
    经典类:深度优先查找,按照从左往右的顺序一个分支一个分支的找下去,在第一个分支就查找顶级类
    obj->A->B->E->G->C->F->D

    5. 派生
    在子类中定义自己的属性,如果与父类的属性重名,那以自己的为准.

    在子类派生的新方法中重用父类的功能:
    方式一:指名道姓地调用某一个类的函数
    特点:
    1. 与继承无关
    2. 没有自动传值的效果

    class OldboyPerson:#父类
    school="oldboy"
    def __init__(self,name,age,gender):
    self.name=name
    self.age=age
    self.gender=gender

    class Teacher(OldboyPerson):#子类
    def __init__(self,name,age,gender,level,salary):
    OldboyPerson.__init__(self,name,age,gender)
    self.level = level
    self.salary = salary


    方式二:super()得到一个特殊的对象,该对象专门用来引用父类的属性
    特点:
    1. 严格依赖继承,super会完全参照类的mro列表依次查找属性
    2. 有自动传值的效果
    方式一种的:OldboyPerson.__init__(self,name,age,gender)
    替换为:super(Teacher, self).__init__(name,age,gender)
  • 相关阅读:
    树莓派的入网方式和远程连接
    数据结构与算法之递归(C++)
    c++中字符串输入注意的问题
    基于视觉的机械臂分拣(二)
    基于视觉的机械臂分拣(一)
    数据结构与算法之折半查找(C++)
    数据结构与算法之顺序查找(C++)
    ROS之USB摄像头识别二维码问题解决
    机械臂开发之正运动学
    利用vs pcl库将多个PCD文件合并成一张PCD地图
  • 原文地址:https://www.cnblogs.com/du-jun/p/9838389.html
Copyright © 2011-2022 走看看