2021年了你还不了解新式类与经典类?

本文探讨了Python中的新式类和经典类,强调了新式类从Python 2.2版本开始引入的变化,如类和类型的统一、基类`object`的使用以及内置运算方法的搜索变化。新式类的改变提高了性能和一致性,要求开发者在实现内置运算时手动实现相关方法。文章还提供了一些代码示例来展示新式类和经典类之间的差异。
摘要由CSDN通过智能技术生成

“新式类” 与 “经典类”

我们所接触到的类,都是 “新式类”( new-style classes )。同时,在 Python 2.X 相关的版本中,还存在另外一种称之为 “经典类”( classic classes )的类。接下来,我们就来看看 “新式类” 和 “经典类” 在概念上的区别,以及由 “经典类” 到 “新式类” 的所引入的变化。

这里多说一句,小编是一名python开发工程师,这里有我自己整理了一套最新的python系统学习教程,包括从基础的python脚本到web开发、爬虫、数据分析、数据可视化、机器学习等。想要这些资料的可以进QQ群609616831领取。

如何成为 “新式类”?

Python 2.X 中,我们将继承自 object 或其他内置类型的类称为 “新式类”,将除此之外的其他类称为 “经典类” 或 “旧式类”。在Python 3.X中,所有的类均隐式自动的继承自object,即所有的类都是 “新式类”。这一点总结起来,可以认为 “新式类” 在Python 2.X 中是可选的(是否继承自 object )功能,在 Python 3.X 是原生固有的功能。

更进一步,在 Python 2.X 中,若考虑到继承的存在,我们上面对于 “如何成为新式类” 的定义应该被进一步拓宽:在派生类的基类继承链中,只要在任一位置处出现了 object 或者内置类型,则该派生类便会成为 “新式类”。

# Python 2.7
>>> class A:
...     pass
... 
>>> class B(object):
...     pass
... 
>>> class C(A, B):
...     pass
... 
>>> a = A()
>>> b = B()
>>> c = C()
>>> a
<__main__.A instance at 0x7f19000c0dd0>
>>> b
<__main__.B object at 0x7f190010cd90>
>>> c
<__main__.C object at 0x7f19000cafd0>

何为 “新式类”?

“新式类” 所涉及的相关特性是从 Python 2.2 开始逐步引入的,我们之所以将其称为 “新式类”,是因为它们在语言特性层面上和之前的类(“经典类”)有着非常显著的变化,这些变化体现在OOP的各个方面。笼统地说,“新式类” 不仅在之前 “经典类” 的基础上从多个方面进行了特性上的修改,也在多个方面进行了特性上的扩展。我们下面就从细节上看看 “新式类” 的改变与新增之处。

“新式类” 的改变与新增

“新式类” 的改变

类和类型的合并

在 “新式类” 中,一个实例对象的类型便是实例化它的类,即 “新式类” 中类和类型的概念得到了统一。关于 “类” 和 “类型” 的统一,在前面 “一切皆对象” 的小节中简单的提到过,“在新式类中,类和类型的概念合并,类即是类型”,但我们并没有涉及到这个结论的相关细节性内容,接下来我们便更进一步,详细地看看这部分内容。在阅读和理解代码示例前,我们需要提前预习和回顾两个知识点,分别是元类、type()obj.__class__

简要的说,元类是一种可以拦截类创建的机制,它可以在 class 语句中插入创建类对象时自动执行的相关逻辑,主要用于管理和扩展类。type 类是实例化关系中最顶层的对象(它的另外一个角色是作为内置函数查看对象的类型),默认情况下类由 type 类创建,而元类则通常是 type 类的定制化子类;

type() 返回传入对象的类型,obj.__class__ 则返回类实例所属的类。在 “新式类” 中,type(obj) obj.__class__两者的返回结果相同;而在 “经典类” 中,前者返回始终为 instance,而后者则会返回

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值