洗礼灵魂,修炼python(43)--巩固篇—经典类/新式类
经典类
1.什么是经典类
就是在使用class关键词时,括号内不添加object类的就叫经典类,前面的博文里是绝对解析过的,所以你应该知道,经典类现在已经仅存在于python2了,因为python3不管你给没给object都会自动继承object类,其采用MRO算法深度优先搜索。Python 2.x中默认都是经典类,只有显式继承了object才是新式类
例:
像这种,如果不给object生成的类只有自己的属性方法,加上一个文档属性__doct__,一个模块方法__module__
2.特性:深度优先
什么叫深度优先,当多重继承时,会按照父类线路优先继承,如果父类不存在,再最后按照其他线路继承,什么意思呢?看个例子吧
C类同时继承了A和B,但是name属性的结果却是A的name属性,那如果C也有name属性呢?
自然,这个是没什么问题的吧?子类继承父类时,如果子类与父类有相同属性,子类的属性会覆盖父类的属性,这个大家都知道吧?
那如果再多一个父类继承呢?
什么情况?分析一下,C类同时继承了A和B,A又继承与P,C的name属性却是P类的name属性值,像这种就是深度优先,这就是经典类的特性,画个图解释下:
C类因为同时继承了A和B,所以就有两条线路走,C—>A—>P和C—>B,但是优先级更高的是以纵向继承的前者,所以会继承P的name属性
不过还要注意一个情况:
它还是优先纵向继承
新式类
1.什么是新式类
就是在使用class关键词创建类时,给定了继承object基类的就叫新式类。其采用C3算法广度优先搜索。Python 3.x中默认都是新式类,经典类被移除,不必显式的继承object。新式类对象可以直接通过__class__属性获取自身类型:type。例:
和前面经典类做对比,很明显的,继承类object类的属性和方法都很多
2.特性:广度优先
什么叫广度优先,当多重继承时,会尽量避免深度继承,深度能浅一点就浅一点,如果实在无法解决,再最后按照父类的深度来继承,什么意思呢?看个例子吧
这么看好像和经典类的继承方式是一样的对吧?不急再加一层父类看看:
不多说,图解:
它的线路是C—>A—>B—>P和C—>A—>P和C—>B—>P,优先级最高的是前者,先横向查找,实在没有再纵向。
同样的,要注意一个情况:
当B类不继承P时,并且和P类都继承object时,在相同属性下不再遵守广度优先规则,而是一路纵向,得到的还是P类的name属性。这个情况很特殊,记住了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】