面试题:python2类继承object和不继承object有什么区别

​python2中定义类时继承object和不继承object有什么区别?

 

stackoverflow上也有人提出了这样的问题:

https://stackoverflow.com/questions/332255/difference-between-class-foo-and-class-fooobject-in-python

 

首先说明,这个区别只存在于python2,python3中即使未继承object也会默认继承object。

 

一、继承顺序不同

 

让我们从一个比较简单的例子入手来解答这个问题,以下代码python版本为2.7

 

例子1:

 

 

D继承于B类和C类,B类和C类分别继承于父类A,其中A类不继承于object。

 

这段代码的输出是这样的:

 

 

好,现在我们换种写法,让父类A继承于object,其他不做变动,如下图:

 

猜一猜结果变成了什么:

 

 

是不是很奇怪,这是为什么呢?

 

我们把未继承object的类称为经典类,把继承object的类称为新式类。

 

为了便于理解我们画出上述例子的关系图,上述例子的继承关系图是这样的:

 

经典类(不继承object)使用的解释顺序是MRO算法,该算法基于深度优先,也就是说,上述例子中,解释顺序是这个样子的:

由D出发 查找继承类B是否有func()方法,没有则继续查找B的继承类A是否有,查找到A有,则查找结束,否则继续查找C。

即查找顺序如下图红线所示:

新式类(继承object)使用的解释顺序是C3算法,查找顺序有所区别;

由D出发,查找继承类B是否有func()方法,没有则继续查找继承类C的是否有func方法,查找到有则查找结束,否则继续查找A,直至查找至object。

即查找顺序如下图红线所示:

 

可以通过__mro__属性知道新式类的查找顺序,经典类没有这个属性。

 

 

所以,经典类和新式类的区别之一,即继承object和不继承object的区别之一在于多继承时其继承顺序不同,经典类采用深度优先方法,新式类采用C3算法。

 

二、新式类有super方法,用于调用父类(超类)的方法,经典类没有。

super()函数的解释:

https://www.runoob.com/python/python-func-super.html

 

三、新式类提供了__new__方法,用于提供方法以实例化不可变对象,如派生的字符串,数字等。

 

四、新式类提供了更多的方法,如__get__,__set__方法,有这些方法的对象称为描述器。

 

五、定义一个经典类,实际上并不会创建一个新的类型,类是类对象,实例是实例对象,而新式类做了统一,定义一个新的类就是创建了一个新的类型。可以用type()来验证。

 

 

 

参考链接:

https://www.python.org/download/releases/2.3/mro/

https://pyzh.readthedocs.io/en/latest/Descriptor-HOW-TO-Guide.html

 

来源:

公众号:pipi的奇思妙想

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值