1.新式类与经典类
在Python 2及以前的版本中,由任意内置类型派生出的类(只要一个内置类型位于类树的某个位置),都属于“新式类”,都会获得所有“新式类”的特性;反之,即不由任意内置类型派生出的类,则称之为“经典类”。
“新式类”和“经典类”的区分在Python 3之后就已经不存在,在Python 3.x之后的版本,因为所有的类都派生自内置类型object(即使没有显示的继承object类型),即所有的类都是“新式类”
2.新式类
新式类的MRO(Method Resolution Order, 方法解析顺序),采用的是从左到右,广度优先的方式进行查找。比如下面的代码,类A即为新式类,查找顺序为D->B->C->A,因此print D().name()调用的是类C的name方法,将输出字符C。
class A(object):
def name(self):
return 'A'
class B(A):
pass
class C(A):
def name(self):
return 'C'
class D(B, C):
pass
if __name__ == '__main__':
print D().name()
另外,新式类的类型是type,也就是对于上述代码执行type(A)将得到<type ‘type’>。
2.经典类
经典类的MRO(Method Resolution Order, 方法解析顺序),方法和属性的查找链是按照从左到右,深度优先的方式进行查找。比如下面的代码,查找顺序为D->B->A->C,因此print D().name()调用的是类A的name方法,将输出字符A。经典类的类型是classobj,执行type(A)将得到<type ‘classobj’>
class A():
def name(self):
return 'A'
class B(A):
pass
class C(A):
def name(self):
return 'C'
class D(B, C):
pass
if __name__ == '__main__':
print D().name()