1. 什么是继承 继承是一种新建类的方式,新建的类称之为子类/派生类,被继承的类称之为父类/基类/超类 继承有3个特色: 1. 子类能够遗传/重用父类的属性(解决类与类之间代码冗余的问题) 2. 在python中一个子类能够同时继承多个父类 3. 在继承的背景下,类分为两种:新式类,经典类 新式类:但凡继承object类的子类,以及该子类的子子孙孙都是新式类 在python3中一个类即使是没有显式地继承任何类,默认就继承object类, 即在python3中全部类都是新式类 经典类:没有继承object类的子类,以及该子类的子子孙孙都是经典类 强调:只有在python2中才有经典类 在python2中若是一个类没有显式地继承任何类,并不会自动继承object类2. 为什么要用继承:减小类与类之间的代码冗余3. 如何继承 :先抽象再继承# 在python中继承的特色?单继承(用一个父类)&多继承(用多个父类)x = 2class Foo: x = 1 passobj = Foo()obj.x = 3print(obj.x)4. 属性查找 在没有出现菱形继承的状况下,属性的查找是按照从左往右的顺序一个分支一个分支的找下去 在单继承背景下,不管是新式类仍是经典类属性查找顺序都同样 先obj->类->父类->... 在出现菱形继承(一个子类继承的多个分支最终汇聚到一个非object类)的状况下, 在多继承背景下,若是一个子类继承了多个分支,可是多个分支最终汇聚到一个非object类(菱形继承问题) 面试常问问题***** 新式类(.mro()):广度优先查找,按照从左往右的顺序一个分支一个分支的找下去,在最后一个分支才去查找顶级类 obj->A->B->E->C->F->D->G->object 经典类:深度优先查找,按照从左往右的顺序一个分支一个分支的找下去,在第一个分支就查找顶级类 obj->A->B->E->G->C->F->D5. 派生 在子类中定义本身的属性,若是与父类的属性重名,那以本身的为准. 在子类派生的新方法中重用父类的功能: 方式一:指名道姓地调用某一个类的函数 特色: 1. 与继承无关 2. 没有自动传值的效果class OldboyPerson:#父类 school="oldboy" def __init__(self,name,age,gender): self.name=name self.age=age self.gender=genderclass 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)