写点什么

python 多继承的 3C 算法是什么?怎么用?

  • 2024-08-15
    湖南
  • 本文字数:1523 字

    阅读完需:约 5 分钟

有很多地方都说 python 多继承的继承顺序,是按照深度遍历的方式,其实 python 多继承顺序的算法,不是严格意义上的深度遍历,而是基于深度遍历基础上优化出一种叫 3C 算法

python 多继承的深度遍历

class C:    def run(self):        print("这个是C类的方法");    pass; class A(C):    # def run(self):    #     print("这个是A类的方法");    pass; class B:    def run(self):        print("这个是B类的方法"); class MainC(A,B):    pass;    # def run(self):    #     print("这个是子类的方法"); m1 = MainC();m1.run();print(MainC.mro())
复制代码


这段代码输出的结果就是 这个是 C 类的方法 [<class 'main.MainC'>, <class 'main.A'>, <class 'main.C'>, <class 'main.B'>, <class 'object'>]

每个类如果没有继承其他类的话就默认继承 object 这个基类 这个是比较正常的多继承,然后是深度遍历的方式

重复继承的问题

基于上面改造一下

class C:    def run(self):        print("这个是C类的方法");    pass; class A(C):    # def run(self):    #     print("这个是A类的方法");    pass; class B(C):    def run(self):        print("这个是B类的方法"); class MainC(A,B):    pass;    # def run(self):    #     print("这个是子类的方法"); m1 = MainC();m1.run();print(MainC.mro())
复制代码


这个继承顺序就有意思了,main 继承 A 和 B,A 继承 C,B 也继承 C,这就出现了重复继承的问题,那这种情况 python 是如何决定继承顺序的呢 输出结果:

这个是B类的方法 [<class '__main__.MainC'>, <class '__main__.A'>, <class '__main__.B'>, <class '__main__.C'>, <class 'object'>]
复制代码

这个结果就出乎意料了,因为按照深度遍历的方式的话,也应该继承 C 再继承 B,但是却不是这样的 这个是因为 python 对于重复继承的处理,按照这个继承方式的话继承顺序是这样的 mianC 先继承 A,然后到查看 C 的情况,发现 C 同时被 A 和 B 继承了,然后就先不处理,接着继承 B,然后看 C 的时候发现,没有其他的继承了,就接着继承 C

更加复杂的继承

class F:    def run(self):        print("这个是F类的方法");    pass; class G:    def run(self):        print("这个是G类的方法");    pass; class E(F,G):    def run(self):        print("这个是E类的方法");    pass; class C(E):    def run(self):        print("这个是C类的方法");    pass; class D(E):    def run(self):        print("这个是D类的方法"); class A(C):    # def run(self):    #     print("这个是A类的方法");    pass; class B(D):    def run(self):        print("这个是B类的方法"); class MainC(A,B):    pass;    # def run(self):    #     print("这个是子类的方法"); m1 = MainC();m1.run();print(MainC.mro())
复制代码


继承顺序:

[<class '__main__.MainC'>, <class '__main__.A'>, <class '__main__.C'>, <class '__main__.B'>, <class '__main__.D'>, <class '__main__.E'>, <class '__main__.F'>, <class '__main__.G'>, <class 'object'>]
复制代码

这个就是跟复杂的多继承了,但是只要用到上面说的逻辑去推理就知道继承顺序了 mainc 先继承 A,然后看 C,没有被重复继承,就继承 C,再看 E,E 被重复继承了,先不处理,再从上面开始看,看 B,没有被重复继承,再看 D 也没有被重复继承,直接继承,再看 E,也没有其他的再继承了就可以直接继承,然后再看 F,没有重复继承,就继承,再到 G。


这个就是实际上 python 多继承顺序的算法,如果单纯说是深度遍历,其实是不对的

注意

尽量不要用多继承,尽量不要用多继承,尽量不要用多继承。 用多继承会让你的程序变得复杂又难读,产生的 bug 也难查

用户头像

欢迎关注,一起学习,一起交流,一起进步 2020-06-14 加入

公众号:做梦都在改BUG

评论

发布
暂无评论
python多继承的3C算法是什么?怎么用?_Python_我再BUG界嘎嘎乱杀_InfoQ写作社区