类的继承
1 什么是继承
继承一种新建类的方式,新建的类称之为子类/派生类,被继承的类称之为父类\基类\超类
python中继承的特点:
1. 子类可以遗传/重用父类的属性
2. python中一个子类可以同时继承多个父类
3. 在继承背景下去说,python中的类分为两种:新式类,经典类
新式类: 但凡继承了object的类Foo,以及该类的子类...都是新式类
在python3中一个类即便是没有显式地继承任何类,默认就会继承object
即python3中所有的类都是新式类
1 什么是继承
继承一种新建类的方式,新建的类称之为子类/派生类,被继承的类称之为父类\基类\超类
python中继承的特点:
1. 子类可以遗传/重用父类的属性
2. python中一个子类可以同时继承多个父类
3. 在继承背景下去说,python中的类分为两种:新式类,经典类
新式类: 但凡继承了object的类Foo,以及该类的子类...都是新式类
在python3中一个类即便是没有显式地继承任何类,默认就会继承object
即python3中所有的类都是新式类
经典类:没有继承object的类,以及该类的子类...都是经典类
在python2中才区分新式类与经典类,
在python2中一个类如果没有显式地继承任何类,也不会继承object
2 为何要用继承
减少类与类之间代码冗余
3 如何用继承
问题:
1 子类如何重用父类的属性
总结对象之间的相似之处得到类,总结类与类之间的相似之处就得到了类们的父类
在子类派生出的新方法中重用父类功能的方式一:
指名道姓地引用某一个类中的函数
总结:
1. 与继承无关
2. 访问是类的函数,没有自动传值的效果
2 在继承背景下,属性查找的优先级
在单继承背景下属性的查找优先级:对象->对象的类->父类->父类.....
在多继承背景下属性的查找优先级:
如果一个子类继承多个分支(多个分支没有共同继承一个非object的类)
此时属性的查找优先级是:对象->对象的类->按照从左往右的顺序一个分支一个分支的找下去
菱形继承问题:
新式类 : 广度优先查找,从左往右一个分支一个分支的查找,在最后一个分支才去查找顶级类
经典类 : 深度优先查找,从左往右一个分支一个分支的查找,在第一个分支就查找顶级类
3 新式类与经典类在属性查找上的区别
新式类(广度优先): obj->A->B->E->C-F->D->G->object
经典类(深度优先): obj->A->B->E->G->C-F->D
针对新式类来说: python专门为新式类内置了一个mro的方法,用来查看c3算法的计算结果,结果是??
在子类派生出的新方法中重用父类功能的方式一:
在子类派生出的新方法中,重用父类功能的方式一:指名道姓的方式(访问类中的函数,该传几个传几个)
特点1:与继承毫无关系
特点2:
在子类派生出的新方法中重用父类功能的方式二:super()必须在类中用
在python2中:super(自己的类名,自己的对象)
在python3中:super() # 调用supper(函数),得到特殊的对像。
调用该函数会得到一个特殊的对象,该对象专门用来访问父类中的属性,!!!完全参照mro列表!!!!
总结:
1. 严格依赖继承的mro列表
2. 访问是绑定方法,有自动传值的效果
在python2中才区分新式类与经典类,
在python2中一个类如果没有显式地继承任何类,也不会继承object
2 为何要用继承
减少类与类之间代码冗余
3 如何用继承
问题:
1 子类如何重用父类的属性
总结对象之间的相似之处得到类,总结类与类之间的相似之处就得到了类们的父类
在子类派生出的新方法中重用父类功能的方式一:
指名道姓地引用某一个类中的函数
总结:
1. 与继承无关
2. 访问是类的函数,没有自动传值的效果
2 在继承背景下,属性查找的优先级
在单继承背景下属性的查找优先级:对象->对象的类->父类->父类.....
在多继承背景下属性的查找优先级:
如果一个子类继承多个分支(多个分支没有共同继承一个非object的类)
此时属性的查找优先级是:对象->对象的类->按照从左往右的顺序一个分支一个分支的找下去
菱形继承问题:
新式类 : 广度优先查找,从左往右一个分支一个分支的查找,在最后一个分支才去查找顶级类
经典类 : 深度优先查找,从左往右一个分支一个分支的查找,在第一个分支就查找顶级类
3 新式类与经典类在属性查找上的区别
新式类(广度优先): obj->A->B->E->C-F->D->G->object
经典类(深度优先): obj->A->B->E->G->C-F->D
针对新式类来说: python专门为新式类内置了一个mro的方法,用来查看c3算法的计算结果,结果是??
在子类派生出的新方法中重用父类功能的方式一:
在子类派生出的新方法中,重用父类功能的方式一:指名道姓的方式(访问类中的函数,该传几个传几个)
特点1:与继承毫无关系
特点2:
在子类派生出的新方法中重用父类功能的方式二:super()必须在类中用
在python2中:super(自己的类名,自己的对象)
在python3中:super() # 调用supper(函数),得到特殊的对像。
调用该函数会得到一个特殊的对象,该对象专门用来访问父类中的属性,!!!完全参照mro列表!!!!
总结:
1. 严格依赖继承的mro列表
2. 访问是绑定方法,有自动传值的效果