Python新式类和经典类的区别

Python013

Python新式类和经典类的区别,第1张

A.在Python里凡是继承了object的类,都是新式

B.Python3里只有新式类

C.Python2里面继承object的是新式类,没有写父类的是经典类

D.经典类目前在Python里基本没有应用

E.保持class与type的统一对新式类的实例执行a.class与type(a)的结果是一致的,对于旧式类来说就不一样了

F.对于多重继承的属性搜索顺序不一样新式类是采用广度优先搜索,旧式类采用深度优先搜索

也可以在我的博客阅读: https://jiajunhuang.com/articles/2019_05_29-python_old_new_style_class.md.html

Python2.3之前,使用的是老式继承,直接看例子:

这样下来,方法查找链就是这样的:

因此,不能再有一个新的类来继承 A 和 B,因为 A 的继承顺序是 X-Y,而 B 的继承顺序是 Y-X,那么到底是先在 X 里查找还是先在 Y 里查找呢?

为了解决这个问题,引入了 C3 MRO,还是以例子来说明:

那么方法查找链是这样:

计算的时候就是:

规则就是,以继承时的声明为顺序,每次取方法查找链的头一个,如果这个头不在后面的方法查找链的尾部,那么就把他放到方法查找链

里,首先方法查找肯定是在 B 里进行,然后是 merge(DO, EO, DE) , D 是一个好的节点,因为 D 不在 DO, EO, DE 的尾部。然后是

O,O 在 EO 的尾部。然后是 E ,然后是 O 。

所以最后方法查找链就是 B ->D ->E ->O 。

同样,拿上面的例子来看,C3 MRO的查找顺序就应该是 A ->X ->Y ->B ->O

参考资料:

在Python 2.1之前,旧式类是用户可用的唯一样式

(旧式)类的概念与类型的概念无关:如果x是旧式类的实例,则x.__class__指定的类x,但type(x)始终为<type

 'instance'>。这反映了这样一个事实,即所有旧式实例(独立于其类)均使用称为实例的单个内置类型实现。

在Python 2.2中引入了新的类,以统一class和type的概念。新型类只是用户定义的类型,不多也不少。如果x是新样式类的实例,则type(x)通常与x 相同x.__class__(尽管不能保证–允许新样式类实例覆盖为返回的值x.__class__)。

引入新型类的主要动机是提供具有完整元模型的统一对象模型。

它还具有许多直接的好处,例如能够对大多数内置类型进行子类化,或者引入了“描述符”,以启用计算属性。出于兼容性原因,默认情况下,类仍为旧样式。通过将另一个新样式类(即一种类型)指定为父类或“顶级类型”对象(如果不需要其他父类)来创建新样式类。

新样式类的行为与旧样式类的行为不同,除了返回什么类型外,还有许多重要的细节。其中一些更改是新对象模型的基础,例如调用特殊方法的方式。其他是出于兼容性考虑而无法实现的“修复程序”,例如在多重继承的情况下的方法解析顺序。

Python 3仅具有新型类。无论是否从中继承子类object,类都是Python 3中的新型样式。