发信息做推广,我选黔优网

发布产品信息
微信公众号

一文详解python多继承的3C算法

我要举报 来源:黔优网作者:小优 责编:小优 时间:2024-08-14 13:57:22 浏览量:64
导读:python多继承的3C算法有很多地方都说python多继承的继承顺序,是按照深度遍历的方式,其实python多继承顺序的算法,不是严格意义上的深度遍历,而是基于深度遍历基础上优化出一种叫3C算法python多继承的深度遍历1234

python多继承的3C算法

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

python多继承的深度遍历

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

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这个基类 这个是比较正常的多继承,然后是深度遍历的方式


重复继承的问题

基于上面改造一下

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

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是如何决定继承顺序的呢 输出结果:

1

2

这个是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


更加复杂的继承

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

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())

继承顺序:

1

[<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 查找轮廓的实现示例
 
没用 0举报 收藏 0评论 0
免责声明:
以上展示内容来源于用户自主上传及公开网络信息收集整理,版权归属原作者所有,平台不承担内容准确性责任,版权争议与本站无关。本文涉及见解与观点不代表黔优网官方立场,仅供技术交流参考,黔优网为纯技术资讯交流平台,不参与任何商业服务及交易行为,所有企业信息均经基础资质审核后展示。本文标题:一文详解python多继承的3C算法,本文链接:https://www.qianu.com/n/693766.html,欢迎转载,转载时请说明出处。若您发现本文涉及版权争议或违法违规内容,请您立即通过点此【投诉举报】并提供有效线索,也可以通过邮件(邮箱号:kefu@qianu.com)联系我们及时修正或删除。
 
 

 

 
推荐图文资讯