一文详解python多继承的3C算法
python多继承的3C算法
有很多地方都说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多继承的3C算法的文章就介绍到这了,更多相关python 3C算法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
Python访问MongoDB,并且转换成Dataframe的方法
今天小编就为大家分享一篇Python访问MongoDB,并且转换成Dataframe的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧2018-10-10
Django配置celery(非djcelery)执行异步任务和定时任务
这篇文章主要介绍了Django配置celery(非djcelery)执行异步任务和定时任务,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧2018-07-07
Python爬虫库requests-html进行HTTP请求HTML解析等高级功能应用
这篇文章主要为大家介绍了Python爬虫库requests-html进行HTTP请求HTML解析JavaScript渲染以及更高级的功能应用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2023-12-12
用python记录运行pid,并在需要时kill掉它们的实例
下面小编就为大家带来一篇用python记录运行pid,并在需要时kill掉它们的实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧2017-01-01


最新评论