加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python 3 mro

发布时间:2020-12-20 10:51:36 所属栏目:Python 来源:网络整理
导读:__mro__ 1.只有在python2中才分新式类和经典类,python3中统一都是新式类2.在python2中,没有显式的继承object类的类,以及该类的子类,都是经典类3.在python2中,显式地声明继承object的类,以及该类的子类,都是新式类3.在python3中,无论是否继承object,

__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 ‘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,f):
    def f1(self):
        print("zx")

wl=zx()
wl.f1()
print(zx.__mro__)

(<class ‘main.zx‘>,<class ‘main.h‘>,<class ‘main.i‘>,<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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读