__mro__
1.只有在python2中才分新式类和经典类,python3中统一都是新式类 2.在python2中,没有显式的继承object类的类,以及该类的子类,都是经典类 3.在python2中,显式地声明继承object的类,以及该类的子类,都是新式类 3.在python3中,无论是否继承object,都默认继承object,即python3中所有类均为新式类
__mro__三次进化
经典类(classic class)的深度遍历。
Python 2.2 的新式类(new-style class)预计算。
Python 2.3 的新式类的C3 算法。它也是 Python 3 唯一支持的方式。
简单说下实现:
前面两种都是基于深度遍历的,但是第一种重复保留的是第一个,第二种,重复保留的是最后一个
第三种就是基于c3算法的
为啥要用c3算法?是为了解决原来基于深度优先搜索算法不满足本地优先级,和单调性的问题。
菱形
zx (<class ‘ main .zx‘>, <class ‘ main .c‘>, <class ‘ main .b‘>, <class ‘ main .e‘>, <class ‘ main .d‘>, <class ‘ main .g‘>, <class ‘ main .f‘>, <class ‘ main .a‘>, <class ‘object‘>)
class a: def f1(self): print("a") class b(a): def f1(self): print("b") class c(b): def f1(self): print("c") class d(a): def f1(self): print("d") class e(d): def f1(self): print("e") class f(a): def f1(self): print("f") class g(f): def f1(self): print("g") class zx(c,e,g): def f1(self): print("zx") wl=zx() wl.f1() print(zx.__mro__)
zx (<class ‘ main .zx‘>, <class ‘ main .c‘>, <class ‘ main .b‘>, <class ‘ main .a‘>, <class ‘ main .e‘>, <class ‘ main .f‘>, <class ‘ main .d‘>, <class ‘object‘>)
class a: def f1(self): print("a") class b(a): def f1(self): print("b") class c(b): def f1(self): print("c") class d: def f1(self): print("d") class e(d): def f1(self): print("e") class f(d): def f1(self): print("f") class zx(c,e,f): def f1(self): print("zx") wl=zx() wl.f1() print(zx.__mro__)
(<class ‘ main .zx‘>, <class ‘ main .b‘>, <class ‘ main .c‘>, <class ‘ main .a‘>, <class ‘ main .h‘>, <class ‘ main .f‘>, <class ‘ main .i‘>, <class ‘ main .g‘>, <class ‘ main .e‘>, <class ‘ main .d‘>, <class ‘object‘>)
class a: def f1(self): print("a") class b(a): def f1(self): print("b") class c(a): def f1(self): print("c") class d: def f1(self): print("d") class e(d): def f1(self): print("e") class f(d): def f1(self): print("f") class g(e): def f1(self): print("g") class h(f): def f1(self): print("h") class i(g): def f1(self): print("i") class zx(b,c,h,i): def f1(self): print("zx") wl=zx() wl.f1() print(zx.__mro__)
简单的线性继承还是有规律可循的,总结来说就是解菱形,如果分支不含菱形就直接找到-1层,等待其他分支来找obj,因为最终各条线路的终点肯定是obj
声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://haodehen.cn/did172358