1.什么是继承? 继承是新建类的一种方式 新建的类我们称之为子类或者叫派生类 被继承的类我们称之为父类或者基类 子类可以使用父类中的属性或者方法
2.为什么要用继承? 类解决了对象与对象之间的代码冗余问题 继承解决的是类与类之间的代码冗余问题
3.如何使用继承? 新式类: 继承了object类的子子孙孙类都是新式类 经典类: 没有继承了object类的子子孙孙类都是经典类 新式类和经典类只有在python2中区分 因而在Python3中统一都是新式类
不使用继承 class Animal: def run(self): print('走路') def eat(self): print('吃饭') class Dog: def run(self): print('走路') def eat(self): print('吃饭') def speak(self): print('汪汪叫') class Person: def run(self): print('走路') def eat(self): print('吃饭') def work(self): print('上班') 这样人和狗都有共同的特性 走路和吃饭 就有重复的特性 使得代码冗余 这样就可以使用继承来解决这个问题
继承的特性是:子类会遗传父类的属性和方法 继承是类与类之间的关系
使用继承: Dog子类Person子类都继承Animal父类 class Animal: # 它作为父类 head = 1 def run(self): print('走路') def eat(self): print('吃饭') # 子类会遗传父类的属性和方法 class Dog(Animal): # 它做为子类 def speak(self): print('汪汪叫') # 子类会遗传父类的属性和方法 class Person(Animal): # 它做为子类 def work(self): print('工作') dog = Dog() dog.eat() # 打印结果: 吃饭 print(dog.head) # 打印结果: 1
单继承下属性查找: 查询顺序:先从对象名称空间中查找--》产生对象的类名称空间查找--》继承的父类中查找 class Foo: def f1(self): print('Foo.f1') def f2(self): print('Foo.f2') self.f1() def Bar(Foo): def f1(self): print('Bar.f1') obj = Bar() obj.f2() 输出结果: Foo.f2 Bar.f1
1.单继承:进阶版
class Foo: def __f1(self): _Foo__f1() print('Foo.f1') def f2(self): print('Foo.f2') self.__f1() _Foo__f1() class Bar(Foo): def __f1(self): _Bar__f1() print('Bar.f1') obj = Bar() {} obj.f2() 结果 Foo.f2 Bar.f1
要找出类与类之间的继承关系,需要先抽象,再继承。抽象即总结相似之处,总结对象之间的相似之处得到类,总结类与类之间的相似之处就可以得到父类,如下图所示
基于抽象的结果,我们就找到了继承关系
基于上图我们可以看出类与类之间的继承指的是什么’是’什么的关系(比如人类,猪类,猴类都是动物类)。子类可以继承/遗传父类所有的属性,因而继承可以用来解决类与类之间的代码重用性问题。
多继承的基础应用 class Animal(): 括号什么都没有 表示没有继承 class Animal: def run(self): print('走路') class Coder: def work(self): print('写代码') class Person(Animal, Coder): 可以多继承 类的属性和方法 def eat(self): print('吃饭') p=Person() p.run() 输出结果走路 p.run() 输出结果:走路 p.run() 输出结果:走路
新式类:按照广度优先查询 经典类:按照深度优先查询 class A(object): def test(self): print('from A') class B(A): def test(self): print('from B') pass class C(A): def test(self): print('from C') pass class D(B): def test(self): print('from D') pass class E(C): def test(self): print('from E') pass class F(D, E): 多继承 按照从左往右查找 def test(self): print('from F') pass f1 = F() f1.test()
新式类 ''' 如果一个类继承了object,这个类就是新式类 python3中,所有类都默认继承了object(不写也会继承object类),所以所有类都是新式类 ''' 学生 class Student(object): pass 教师 class Teacher: pass 学校 class School(Student, Teacher): pass 查看一个类,继承了哪些父类 print(School.__bases__) print(Teacher.__bases__) print(School.__bases__)
经典类 没有继承任何父类的 就叫经典类 只有python2中才有 python2中如果要写新式类,需要手动继承object # 如果在python2中 class Student(object): # 新式类 pass class Teacher(): # 经典类 pass python2中的语法 print Student.__bases__ # (<type 'object'>,) print Teacher.__bases__ # () 新式类和经典类的属性查找顺序是不一样的