【PYTHON】浅谈Python中的新式类和经典类

0 引言

在Python3.x之前的Python版本中,Python还是会区分新式类和经典类,新式类也就是在定义类时在括号中写了一个object关键字,而经典类则不用写。但是在面试的过程中,也还是会有可能问道相关的问题,那么我们作为程序员,还是得有所了解才好。

1 讲解

1.1 区别

新式类和经典类的区别主要还是在继承顺序上,经典类的继承顺序是深度优先,而新式类的继承顺序C3算法(不是广度优先,只是结果恰巧与广度优先雷同),这是他们最主要的区别。

1.2 新式类


class NewStyleClassA(object):
    var = 'New Style Class A'


class NewStyleClassB(NewStyleClassA):
    pass


class NewStyleClassC():
    var = 'New Style Class C'


class SubNewStyleClass(NewStyleClassB, NewStyleClassC):
    pass


if __name__ == '__main__':
    print(SubNewStyleClass.mro())
    print(SubNewStyleClass.var)

运行结果如下:


[, , , , ]
New Style Class C

从运行结果可以看出,这就是类似广度优先的算法运行结果,但是其实不是这样的,如果我们将NewStyleClassC改成新式类,也就是在NewStyleClassC中加上object,那么结果会不一样。


class NewStyleClassA(object):
    var = 'New Style Class A'


class NewStyleClassB(NewStyleClassA):
    pass


class NewStyleClassC(object):
    var = 'New Style Class C'


class SubNewStyleClass(NewStyleClassB, NewStyleClassC):
    pass


if __name__ == '__main__':
    print(SubNewStyleClass.mro())
    print(SubNewStyleClass.var)

运行结果如下:


[, , , , ]
New Style Class A

1.3 经典类

经典类只在Python2.x版本中能实现,Python3.x版本中已经没有经典类和新式类的区别了。这里还是刚才的代码,我们可以看看运行结果,体会一下新式类和经典类的区别。


class NewStyleClassA(object):
    var = 'New Style Class A'


class NewStyleClassB(NewStyleClassA):
    pass


class NewStyleClassC():
    var = 'New Style Class C'


class SubNewStyleClass(NewStyleClassB, NewStyleClassC):
    pass


if __name__ == '__main__':
    print(SubNewStyleClass.var)

运行结果如下:


New Style Class A

经典类中,会按照深度优先的搜索顺序向上查找,如果找到就不在查找,否则才会查找NewStyleClassC类。

你可能感兴趣的:(新式类,经典类,Python)