热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Python中新式类与经典类的区别与应用

在Python中,新式类与经典类的主要区别在于是否继承自`object`类。具体而言,继承了`object`类的类被称为新式类,而未继承`object`类的类则被称为经典类。这一区分在Python2中尤为重要,因为新式类引入了许多重要的改进和特性,如属性描述符、方法解析顺序(MRO)等。在Python3中,所有类默认都是新式类,因此不再需要显式地继承`object`。理解这两者的差异对于编写高效且兼容的代码至关重要。

#经典类
class A():pass
#新式类
class A(object):pass

继承 object 类的是新式类,不继承 object 类的是经典类

python2.1及其以前的版本,经典类是唯一可用的形式

python2.2开始 加入了新式类

我们在写自定义的类的时候,往往都是继承自object。object 是python中所有类的基类,继承自它无可厚非,如果我们不继承它行不行?当然行,但是二者会有区别

class A(object):def foo(self):print("A::foo()")class B(A):passclass C(A):def foo(self):print("C::foo()")class D(B,C):passd = D()
d.foo()

python2 or python3 执行的结果都是一样的 "C::foo()"

class A():def foo(self):print("A::foo()")class B(A):passclass C(A):def foo(self):print("C::foo()")class D(B,C):passd = D()
d.foo()

python2 和 python3执行的结果是不一样的 

 也就是说 在python2 中 是否继承自object 对于结果是不一样的,而在python3中没有这个区别。

至于为何在python2中会有区别,那就是因为python2中 有新式类 和 经典类的区别

python3之所以没有区别,调用的都是C中的foo 是因为python3中新式类貌似已经兼容了经典类,无论 A 是否继承 object 类, D 实例中的 foo() 都会执行 C 中的 foo() 。但是在 Python 2.7 中这种差异仍然存在,因此还是推荐使用新式类,要继承 object 类。

上边说的搜索路径 就是mro,后边我们在单独分析mro 具体是如何得到的。。。

python中的MRO_zhangdell的专栏-CSDN博客


推荐阅读
  • Python 是一种支持面向对象编程的高级语言。在 Python 中,几乎所有实体都可以视为对象,每个对象都具有属性和方法。类(Class)充当对象的模板或蓝图,定义了对象的结构和行为。通过类,可以创建具有特定属性和方法的实例对象,从而实现代码的复用性和模块化。 ... [详细]
  • 在尝试对从复杂 XSD 生成的类进行序列化时,遇到了 `NullReferenceException` 错误。尽管已经花费了数小时进行调试和搜索相关资料,但仍然无法找到问题的根源。希望社区能够提供一些指导和建议,帮助解决这一难题。 ... [详细]
  • 2021年7月22日上午9点至中午12点,我专注于Java的学习,重点补充了之前在视频中遗漏的多线程知识。首先,我了解了进程的概念,即程序在内存中运行时形成的一个独立执行单元。其次,学习了线程作为进程的组成部分,是进程中可并发执行的最小单位,负责处理具体的任务。此外,我还深入研究了Runnable接口的使用方法及其在多线程编程中的重要作用。 ... [详细]
  • 在Python编程中,探讨了并发与并行的概念及其区别。并发指的是系统同时处理多个任务的能力,而并行则指在同一时间点上并行执行多个任务。文章详细解析了阻塞与非阻塞操作、同步与异步编程模型,以及IO多路复用技术的应用。通过模拟socket发送HTTP请求的过程,展示了如何创建连接、发送数据和接收响应,并强调了默认情况下socket的阻塞特性。此外,还介绍了如何利用这些技术优化网络通信性能和提高程序效率。 ... [详细]
  • 题目难度:★★☆☆☆ 类型:算法你是一名经验丰富的窃贼,计划对一条街道上的房屋进行盗窃。每栋房屋内都存放有一定数量的现金,但你的行动受到一个关键限制:相邻房屋安装了相互连接的报警系统,因此不能连续偷窃两间相邻的房屋。为了最大化收益,你需要设计一种高效的算法来确定最佳的盗窃方案。本文将通过 Python 代码实现这一问题的优化解决方案,并详细解析其背后的数学原理和算法思路。 ... [详细]
  • 初探设计模式之代理模式:原理与应用解析
    在设计模式中,代理模式通过一个代理对象来控制对真实对象的访问。UML图展示了代理类(如MathProxy)维护了一个引用,使得代理能够访问实际的主题对象。代理模式不仅能够延迟初始化昂贵的对象,还能在访问前后添加额外的操作,如权限检查或日志记录。这种模式在远程服务调用、虚拟代理和智能引用等方面有广泛应用。 ... [详细]
  • 本文详细探讨了OpenCV中人脸检测算法的实现原理与代码结构。通过分析核心函数和关键步骤,揭示了OpenCV如何高效地进行人脸检测。文章不仅提供了代码示例,还深入解释了算法背后的数学模型和优化技巧,为开发者提供了全面的理解和实用的参考。 ... [详细]
  • Java集合框架特性详解与开发实践笔记
    Java集合框架特性详解与开发实践笔记 ... [详细]
  • MongoDB高可用架构:深入解析Replica Set机制
    MongoDB的高可用架构主要依赖于其Replica Set机制。Replica Set通过多个mongod节点的协同工作,实现了数据的冗余存储和故障自动切换,确保了系统的高可用性和数据的一致性。本文将深入解析Replica Set的工作原理及其在实际应用中的配置和优化方法,帮助读者更好地理解和实施MongoDB的高可用架构。 ... [详细]
  • 本次发布的Qt音乐播放器2.0版本在用户界面方面进行了细致优化,提升了整体的视觉效果和用户体验。尽管核心功能与1.0版本保持一致,但界面的改进使得操作更加直观便捷,为用户带来了更为流畅的使用体验。此外,我们还对部分细节进行了微调,以确保软件的稳定性和性能得到进一步提升。 ... [详细]
  • 在处理 GridView 中的行记录时,有时需要动态地添加或删除行,而无需对数据库中的实际数据进行任何更改。本文介绍了如何实现这一功能,确保操作仅限于前端展示层面,而不影响后端数据库的完整性。通过这种方法,用户可以在不修改数据库记录的情况下,灵活地管理 GridView 中的数据展示。 ... [详细]
  • Pentaho Data Integration 中 BaseStep 类 getOutputRowSets 方法详解与代码实例 ... [详细]
  • 浅析Java泛型及其应用
    Java泛型是自JDK 5引入的一项重要特性,旨在增强代码的类型安全性和复用性。通过泛型,开发人员可以在编译阶段进行类型检查,有效避免运行时的类型转换错误。本文将探讨Java泛型的基本概念、实现机制及其在实际开发中的应用场景,帮助读者深入理解并灵活运用这一强大工具。 ... [详细]
  • 在二叉搜索树(BST)中,每个节点的值都大于其左子树中的所有节点值,小于其右子树中的所有节点值,因此BST具有天然的有序性。本文探讨了如何在给定的BST中找到第k小的节点。例如,在节点值分别为5、3、7、2、4、6、8的BST中,第三小的节点值为4。通过中序遍历,可以有效地找到第k小的节点,确保算法的时间复杂度为O(h + k),其中h是树的高度。 ... [详细]
  • PHP中元素的计量单位是什么? ... [详细]
author-avatar
难道我不配_179
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有