一、类的定义
类是描述具有共同属性和方法的对象的抽象集合。
方法:类中的函数称为方法。(方法是与对象绑定的)
根据类来创建对象被称为实例化
二、新式类与经典类
简单的说新式类与经典类的区别即:是否继承object. (新式类继承,而经典类不继承)
写法上的区别
在python3.x中取消了经典类(没有经典类),默认都是新式类,并且不必显式的继承object,也就是说,下面三种都可以。
class A(object):pass class A():pass class A:pass
在python2.x中,默认都是经典类,只有显示继承了object才是新式类。
class A(object):pass '新式类写法' '显示继承object' class A(): pass '经典类写法' class A:pass '经典类写法'
2. 继承顺序上的区别
- 单继承:经典类与新式类没有区别
- 多继承:经典类--深度优先(没有mro属性), 新式类--广度优先(python2.3后 mro采用的是C3算法)
'''新式类的多继承''' 'C3算法' class A: def __init__(self): print('A.fun') class B(A): def __init__(self): super(B,self).__init() print('B.fun') class C(A): def __init(self): super(C,self).__init() print('C.fun') class D(B , C): def __init__(self): super(D,self).__init() print('D.fun') D.__mro__
输出是:
(__main__.D, __main__.B, __main__.C, __main__.A, object)即搜索顺序是 D -> B -> C -> A。如下图。
C3算法
从Python2.3开始,新式类的MRO采用C3算法,解决了单调性和只能继承无法重写的问题.(正常继承与深度优先解析一致)
C3算法解析顺序如下图。
BFS,广度优先(简单了解)
解析顺序。以上图正常继承为例,就是A->B->C->D->E.
菱形继承为例,就是A->B->C->D
参考博客:https://blog.csdn.net/lis_12/article/details/52859376