美文网首页Python全栈工程师
29.2-古典类新式类和MRO

29.2-古典类新式类和MRO

作者: BeautifulSoulpy | 来源:发表于2019-12-18 16:26 被阅读0次

认识一个人靠缘分,了解一个人靠耐心,征服一个人是靠智慧的,和睦去相处要靠包容!

1. Python 古典类 和 新式类

  1. Python2.2之前类是没有共同的祖先的,之后,引入object类,它是所有类的共同祖先类object。
    Python2中为了兼容,分为古典类(旧式类)和新式类;
    Python3中全部都是新式类(都是继承自object对象)。
    新式类都是继承自object的,新式类可以使用super。

  2. Python2中经典类是深度优先原则,新式类中广度优先原则
    Python3中只有广度优先原则,在使用过程中,可以通过mro打印出来,看下继承顺序;

3、新式类相同父类只执行一次构造函数,经典类重复执行多次。

dir(类) # 尽量多继承类的属性;

2. 多继承

OCP原则:多用“继承”、少修改
继承的用途:在子类上实现对基类的增强、实现多态

多态
在面向对象中,父类、子类通过继承联系在一起,如果可以通过一套方法,就可以实现不同表现,就是多态。
一个类继承自多个类就是多继承,它将具有多个类的特征。

2.1 多继承弊端

多继承很好的模拟了世界,因为事物很少是单一继承,但是舍弃简单,必然引入复杂性,带来了冲突。
如同一个孩子继承了来自父母双方的特征。那么到底眼睛像爸爸还是妈妈呢?孩子究竟该像谁多一点呢?
多继承的实现会导致编译器设计的复杂度增加,所以现在很多语言也舍弃了类的多继承。

C++支持多继承;Java舍弃了多继承。

Java中,一个类可以实现多个接口,一个接口也可以继承多个接口。Java的接口很纯粹,只是方法的声明,继承者必须实现这些方法,就具有了这些能力,就能干什么。
多继承可能会带来二义性,例如,猫和狗都继承自动物类,现在如果一个类多继承了猫和狗类,猫和狗都有shout方法,子类究竟继承谁的shout呢?

解决方案
实现多继承的语言,要解决二义性,深度优先或者广度优先;

2.2 Python多继承实现
菱形继承模型(多继承) 与 单继承模型

Python2.2 多继承模型,继承的单调性不能保证;父类和子类都有自己 单独的继承路线;

多继承带来路径选择问题,究竟继承哪个父类的特征呢?
Python使用MRO(method resolution order方法解析顺序)解决基类搜索顺序问题。

历史原因,MRO有三个搜索算法:
经典算法(深度优先算法),按照定义从左到右,深度优先策略。2.2版本之前
左图的MRO是MyClass,D,B,A,C,A
新式类算法(深度优先去重),经典算法的升级,深度优先,重复的只保留最后一个。2.2版本
左图的MRO是MyClass,D,B,C,A,object ;

C3算法(),在类被创建出来的时候,就计算出一个MRO有序列表。2.3之后,Python3唯一支持的算法
左图中的MRO是MyClass,D,B,C,A,object的列表
C3算法解决多继承的二义性 _C3算法:DBCA

经典算法有很大的问题,如果C中有覆盖A的方法,就不会访问到了,因为先访问A。
新式类算法,依然采用了深度优先,解决了重复问题,但是同经典算法一样,没有解决继承的单调性。

C3算法,解决了继承的单调性,它阻止创建之前版本产生二义性的代码。求得的MRO本质是为了线性化,且确定了顺序;

相关文章

  • 29.2-古典类新式类和MRO

    认识一个人靠缘分,了解一个人靠耐心,征服一个人是靠智慧的,和睦去相处要靠包容! 1. Python 古典类 和 新...

  • 新式类和旧式类区别

    Python中类分两种:旧式类和新式类:➤新式类都从object继承,经典类不需要。 ➤新式类的MRO(metho...

  • 请简述python 经典类和新式类的区别?

    Python中类分为两种:经典类和新式类: 新式类都从object继承,经典类不需要。 新式类的MRO算法曹勇c3...

  • 新式类和经典类(旧式类)区别

    1、新式类都从object继承,经典类不需要。 2、新式类的MRO(method resolution order...

  • Python 类

    新式类和旧式类 在python2.x的版本中,有“新式类”和“旧式类(也叫做经典类)”之分。新式类是python2...

  • 新式类、经典类

    继承 object 类的是新式类,不继承 object 类的是经典类,在 Python 2.7 里面新式类和经典类...

  • object

    返回结果为 上面的代码中Foo为古典类型,而Bar为新式类。新式类要求继承自object或者内建类型。事实上,内置...

  • 新式类与经典类

    新式类:继承于object的类都是新式类。 经典类:不是继承object的类都是经典类 在多继承中,新式类采用广度...

  • 类的继承顺序

    python2新式类继承object的类python2经典类未继承任何类的python2新式类和python3的继...

  • 【第21天】python全栈从入门到放弃

    1 为什么要有继承? 2 子类中即实现父类的方法,又实现自己的方法 3 新式类和经典类 新式类:继承object类...

网友评论

    本文标题:29.2-古典类新式类和MRO

    本文链接:https://www.haomeiwen.com/subject/cfsunctx.html