热门标签 | 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博客


推荐阅读
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社区 版权所有