洗礼灵魂,修炼python(43)--巩固篇—经典类/新式类

时间:2022-05-17 14:11:14

经典类

1.什么是经典类

就是在使用class关键词时,括号内不添加object类的就叫经典类,前面的博文里是绝对解析过的,所以你应该知道,经典类现在已经仅存在于python2了,因为python3不管你给没给object都会自动继承object类,其采用MRO算法深度优先搜索。Python 2.x中默认都是经典类,只有显式继承了object才是新式类

例:

洗礼灵魂,修炼python(43)--巩固篇—经典类/新式类

像这种,如果不给object生成的类只有自己的属性方法,加上一个文档属性__doct__,一个模块方法__module__

2.特性:深度优先

什么叫深度优先,当多重继承时,会按照父类线路优先继承,如果父类不存在,再最后按照其他线路继承,什么意思呢?看个例子吧

洗礼灵魂,修炼python(43)--巩固篇—经典类/新式类

C类同时继承了A和B,但是name属性的结果却是A的name属性,那如果C也有name属性呢?

洗礼灵魂,修炼python(43)--巩固篇—经典类/新式类

自然,这个是没什么问题的吧?子类继承父类时,如果子类与父类有相同属性,子类的属性会覆盖父类的属性,这个大家都知道吧?

那如果再多一个父类继承呢?

洗礼灵魂,修炼python(43)--巩固篇—经典类/新式类

什么情况?分析一下,C类同时继承了A和B,A又继承与P,C的name属性却是P类的name属性值,像这种就是深度优先,这就是经典类的特性,画个图解释下:

洗礼灵魂,修炼python(43)--巩固篇—经典类/新式类

C类因为同时继承了A和B,所以就有两条线路走,C—>A—>P和C—>B,但是优先级更高的是以纵向继承的前者,所以会继承P的name属性

不过还要注意一个情况

洗礼灵魂,修炼python(43)--巩固篇—经典类/新式类

它还是优先纵向继承

新式类

1.什么是新式类

就是在使用class关键词创建类时,给定了继承object基类的就叫新式类。其采用C3算法广度优先搜索。Python 3.x中默认都是新式类,经典类被移除,不必显式的继承object。新式类对象可以直接通过__class__属性获取自身类型:type。例:

洗礼灵魂,修炼python(43)--巩固篇—经典类/新式类

和前面经典类做对比,很明显的,继承类object类的属性和方法都很多

2.特性:广度优先

什么叫广度优先,当多重继承时,会尽量避免深度继承,深度能浅一点就浅一点,如果实在无法解决,再最后按照父类的深度来继承,什么意思呢?看个例子吧

洗礼灵魂,修炼python(43)--巩固篇—经典类/新式类

这么看好像和经典类的继承方式是一样的对吧?不急再加一层父类看看:

洗礼灵魂,修炼python(43)--巩固篇—经典类/新式类

不多说,图解:

洗礼灵魂,修炼python(43)--巩固篇—经典类/新式类

它的线路是C—>A—>B—>P和C—>A—>P和C—>B—>P,优先级最高的是前者,先横向查找,实在没有再纵向。

同样的,要注意一个情况:

洗礼灵魂,修炼python(43)--巩固篇—经典类/新式类

当B类不继承P时,并且和P类都继承object时,在相同属性下不再遵守广度优先规则,而是一路纵向,得到的还是P类的name属性。这个情况很特殊,记住了。