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

liftword2周前 (04-28)技术文章2

有很多地方都说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也难查

相关文章

三十二、Python类的继承与多继承详解

继承是面向对象的三大特征之一,也是实现软件复用的重要途径。Python中的继承机制是多继承机制,即一个子类可以同时有多个父类。1.继承的语法Python子类继承父类的语法是在定义子类时,将多个父类放在...

Python | 多继承(python多继承父类参数问题)

在Python中,类可以继承自多个类。这被称为多继承。多继承是一种非常强大的概念,它允许我们将多个类的功能组合到一个类中。在本文中,我们将使用一个简单的示例来说明多继承的概念。假设我们正在编写一个图形...

python之多态、继承、重写篇(python多态的作用特点)

# -*- coding: UTF-8 -*- class Animal: def run(self): print("动物会跑。。") def sl...

Python 中的继承和多态(python多继承的顺序)

Python 中的继承是什么?Python 中的继承是一个特性,允许一个类(子类)使用另一个类(父类)的属性和方法。这有助于我们重用代码并避免重复。思考一下亲子关系:孩子继承了父母的某些特征,但也可以...

Python C3算法多重继承顺序解析机制

在Python的面向对象编程中,多重继承是一个强大而复杂的特性。为了解决多重继承中方法解析顺序的问题,Python采用了C3线性化算法。本文将深入探讨C3算法的原理、实现机制及其在实际开发中的应用。C...