小猿会从最基础的面试题开始,每天一题。如果参考答案不够好,或者有错误的话,麻烦大家可以在留言区给出自己的意见和讨论,大家是要一起学习的 。
废话不多说,开始今天的题目:
问:说说Python新式类和旧式类的区别?
答:Python中类分两种:旧式类和新式类 。python的新式类是从2.2版本引进来的,可以将之前的类叫做经典类或者旧式类。
新式类是官方为了统一类和实例引入的 。在2.2之前,比如2.1版本中,类和类型是不同的,如a是ClassA的一个实例,那么a.__class__返回 ‘ class __main__.ClassA‘ ,type(a)返回总是<type 'instance'>。而引入新类后,比如ClassB是个新类,b是ClassB的实例,b.__class__和type(b)都是返回‘class '__main__.ClassB' ,这样就统一了。
说说新式类和旧式类的区别?
1、新式类都从object继承,经典类不需要。
2、新式类的MRO(method resolution order 基类搜索顺序)算法采用C3算法广度优先搜索,而旧式类的MRO算法是采用深度优先搜索
3、新式类相同父类只执行一次构造函数,经典类重复执行多次。
说说Python2和Python3中的区别?
在Python 3.x中取消了经典类,默认都是新式类,并且不必显式的继承object: class Person(object):pass class Person():pass class Person:pass 三种写法并无区别,推荐第一种
但是在Python2.x中,默认都是经典类,只有显式继承了object才是新式类,即: class Person(object):pass 新式类写法 class Person():pass 经典类写法 class Person:pass 经典类写法
为了确保在Python2.x中使用的是新式类,有两种以下方法:
- 元类,在类模块代码的最前面加入如下代码 __metaclass__ = classname(自定义的某个新式类)。
2. 类都从内建类object直接或者间接地继承。
在Python3里面,不存在这些问题了,默认都是新式类了。
如果对于参考答案有不认同的,大家可以在评论区指出和补充,欢迎留言!