zoukankan      html  css  js  c++  java
  • python 3 mro

    __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

  • 相关阅读:
    SQL SERVER将指定表中的指定字段按照(,)逗号分隔
    关于百度 UEditor的使用
    关于jquery的 $("form").serialize()和 new FormData表单序列化
    mvc5 + ef6 + autofac搭建项目(repository+uow)(二)
    (转载)[FFmpeg]使用ffmpeg从各种视频文件中直接截取视频图片
    sql查看数据库表使用情况
    EF FluentAPI映射一对多 关系时候报错
    (转载)Javascript 进阶 作用域 作用域链
    (转载)loadrunner简单使用——HTTP,WebService,Socket压力测试脚本编写
    [moka学习笔记]yii2.0 rules的用法(收集,不定期更新)
  • 原文地址:https://www.cnblogs.com/zx125/p/11419972.html
Copyright © 2011-2022 走看看