python类的发展史
- 经典类(python2.2以前):是一种没有继承的类,对象类型都是type类型,如果经典类被作为父类,子类调用父类的构造函数时会出错
import inspect
class D:
pass
class E:
pass
class B(D):
pass
class C(E):
pass
class A(B, C):
pass
print(inspect.getmro(A))
import inspect
class D:
pass
class C(D):
pass
class B(D):
pass
class A(B, C):
pass
print(inspect.getmro(A))
- 新式类(python2.2):为了类和内置的类型更加统一,引入新式类。新式类的每个类都继承于一个基类,可以是自定义的类或者其他类,默认是object,子类可以调用父类中的构造函数
class D:
pass
class E:
pass
class B(D):
pass
class C(E):
pass
class A(B, C):
pass
class D:
pass
class C(D):
pass
class B(D):
pass
class A(B, C):
pass
'''
第一种:看起来正常,单实际上感觉到别扭,比如B继承D的f()方法,恰巧C中页实现了f()方法,在A中调用f()函数会选择使用C的,这种应该先从B和B的父类开始查找才是正确的顺序,称为单调性
第二种:菱形模式下BFS解决了DFS查找的顺问题,但是他也违背了单调性
'''
- python2.3-2.7
在这之前BFS算法存在很大的问题,从2.3开始新式类的MRO算法开始使用C3算法,C3算法解决了单调性问和之能继承无法重写的问题 - 新式类一统江山(python3至今)
C3算法解决的问题
1、单调性问题
2、不能重写的问题
拓扑排序:
对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在v之前。通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列,简称拓扑序列。简单的说,由某个集合上的一个偏序得到该集合上的一个全序,这个操作称之为拓扑排序
抽象模拟:
首先找入读为0的点,只有一个A,把A拿出来,把A相关的边裁剪掉,在找到入读点为0的点,有两个(B、C),根据最左侧原则拿B,此时的顺序为AB,裁剪B相关的边。此时入读点为0的有D和C,取最左侧的D,此时的顺序为ABD。此时只有一个入读点为0的点C,裁剪掉C的边,此时的顺序为ABDC。剩下入读点为0的只有E,裁剪E相关的边,此时的顺序为ABDCE。最后一个入读点为0的是object,再去掉object的边,此时顺序为ABDCEobject