脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|shell|

服务器之家 - 脚本之家 - Python - 一文详解python多继承的3C算法

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

2024-07-01 17:49小明同学LukeLiang Python

有很多地方都说python多继承的继承顺序,是按照深度遍历的方式,其实python多继承顺序的算法,不是严格意义上的深度遍历,而是基于深度遍历基础上优化出一种叫3C算法,本文将给大家详细的介绍一下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())

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

这段代码输出的结果就是 这个是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())

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

这个继承顺序就有意思了,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())

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

继承顺序:

[<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算法内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://juejin.cn/post/7385776238492139557

延伸 · 阅读

精彩推荐
  • Pythonpython安装oracle扩展及数据库连接方法

    python安装oracle扩展及数据库连接方法

    这篇文章主要介绍了python安装oracle扩展及数据库连接方法,较为详细的分析了Python下载oracle扩展及Windows、Linux环境下的安装步骤、操作技巧及注意事项,需要...

    design3214272020-09-21
  • Pythonpython+pillow绘制矩阵盖尔圆简单实例

    python+pillow绘制矩阵盖尔圆简单实例

    这篇文章主要介绍了Python+pillow绘制矩阵盖尔圆简单实例,具有一定借鉴价值,需要的朋友可以参考下...

    Python小屋9212021-01-05
  • PythonPython中os模块的实例用法

    Python中os模块的实例用法

    在本篇文章里小编给大家整理的是一篇关于Python中os模块的实例用法,有兴趣的朋友们可以学习下。...

    小妮浅浅10592021-11-20
  • PythonFlask框架WTForm表单用法示例

    Flask框架WTForm表单用法示例

    这篇文章主要介绍了Flask框架WTForm表单用法,结合登录验证的具体实例分析了Flask框架WTForm表单相关使用技巧,需要的朋友可以参考下...

    铠甲巨人8252021-03-19
  • Pythonpython字符串string的内置方法实例详解

    python字符串string的内置方法实例详解

    这篇文章主要介绍了python字符串string的内置方法,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友参考下吧...

    PizerWang10982021-02-21
  • PythonPython实现的HMacMD5加密算法示例

    Python实现的HMacMD5加密算法示例

    这篇文章主要介绍了Python实现的HMacMD5加密算法,简单说明了HMAC-MD5加密算法的概念、原理并结合实例形式分析了Python实现HMAC-MD5加密算法的相关操作技巧,,末...

    开心果汁11142021-01-27
  • PythonPython使用flask框架操作sqlite3的两种方式

    Python使用flask框架操作sqlite3的两种方式

    这篇文章主要介绍了Python使用flask框架操作sqlite3的两种方式,结合实例形式分析了Python基于flask框架操作sqlite3数据库的两种常用操作技巧,需要的朋友可以参...

    罗兵6252021-01-10
  • Pythonpython3中zip()函数使用详解

    python3中zip()函数使用详解

    zip函数接受任意多个可迭代对象作为参数,将对象中对应的元素打包成一个tuple,然后返回一个可迭代的zip对象.这个可迭代对象可以使用循环的方式列出其元...

    junchengberry18792021-03-11