1.什么是继承?
继承是一种关系,必须存在两个对象才可能产生这种关系.
被继承的一方称为父,继承的一方称为子
在程序中,继承指的是类与类之间的关系
2.为什么要使用继承?
通过继承,子可以直接享受父提供的内容
在程序中通过继承,子可以直接使用父提供的已有代码
3.怎么使用继承?
class Father:
pass
class Son(Father):
pass
在子类中,类名后面加上括号,括号内加上父类的名称即可,可以有多个父类,需要用多个父类的话需要在子类括号中以逗号分隔
在python一个子类可以有多个父类,多个父类在括号中以逗号隔开,其他语言不支持
调用:可以使用父类中的属性,也可以使用父类中的函数
4.继承与抽象
先抽象后继承
抽象是:抽取多个类相同的部分形成另一个类
减少重复代码,继承到一些子类不需要的内容,所以需要抽取公共父类
在抽取过程中可能会产生与业务需求无关的类,这是正常的,即公共父类
公共父类的作用是存储多个子类相同的属性和技能
5.派生
什么是派生? 子类继承某个父类并且拥有自己独特的属性或技能,这个类就称派生类
只要子类中出现了任何新内容,他就是一个派生类
6.子类访问父类中的方法
访问父类中的方法减少代码量
super 或者指名道姓的调用 super一定是用在存在继承关系的子类中
1 class Person: 2 def __init__(self,name,age,sex): 3 self.name = name 4 self.age = age 5 self.sex = sex 6 def sayHI(self): 7 print('hello my name is %s age is %s sex is %s'%(self.name,self.age,self.sex)) 8 9 class Student(Person): 10 def __init__(self,name,age,sex,number) 11 #在子类中重用父类方法的方式1,指名道姓的调用,与继承没有关系 12 Person.__init__(self,name,age,sex) 13 #super() 表示创建一个特殊对象,用来调用父类的方法 按照mro的列表顺序查找 14 #在子类中重用父类方法的方式2 15 #super().__init__(name,age,sex) 16 #在python2中super的使用方法与python有所不同,需要传入当前类,当前对象 17 #在python中 super(Student,self).__init__(name,age,sex) 18 self.number = number 19 20 def up_class(self): 21 print('% 正在上课...'%self.name) 22 23 stu1 = Student('alan',20,'man','9527')
7.存在继承关系后的属性查找
对象>>类>>父类>>父类的父类...
优先找对象,如果对象没有则找类,如果类没有会沿着继承关系一直找到最顶层父类
无论是属性还是方法查找对象是一样的
一个子类继承多个父类:
1.按照继承顺序从左到右 谁先继承先找谁
2.深度优先,沿着一条路径找到最高层,如果不存在则换另外一条线
这种查找方式仅仅在非菱形继承的情况下
当存在共同父类时会产生菱形继承关系:::>>>先深度优先再广度优先
8.经典类与新式类
所有之间继承或间接继承object的类 都是新式类
object 类称之为根类 所有类都是源自object
为什么这么设计?
例如:创建对象时,需要申请内存空间,创建新的名称空间,讲对象的属性放入到名称空间,这一些复杂的基础操作,都有object来完成,简单的说object提供了一些常用的基础操作
在python3找那个默认所有类都是新式类
在python2中默认是经典类(不会自动继承object)
__bases__ 用于查看父类
在经典类中,属性的查找按照深度优先,python2中才有经典类,python3中属性的查找顺序先深度后广度
10.mro
显示属性的查找顺序列表,属性的查找顺序就是按照该列表进行查找
子类出现了与父类重复的名字 称之为覆盖
子类出现了与父类不同的名字 称之为拍派生