一、面向对象中的类有两种,新式类和经典类
1、在python2中,经典类是没有继承object的类,以及它的之类都称之为经典类
示例代码如下
class Foo:
pass
class Bar(Foo):
pass
2、在python2中,新式类是继承object的类,以及它的子类都称之为新式类
示例代码如下:
class Foo(object):
pass
class Bar(Foo):
pass
3、在python3中,只有一种面向对象编程的类,那就是新式类,一个类没有继承object类,默认就继承object
示例代码如下:
1 class Foo: 2 pass 3 4 5 print(Foo.__bases__) 6 7 结果如下: 8 9 (<class 'object'>,)
二、多父类继承中属性查找顺序
经典类继承顺序是按照深度优先
新式类继承顺序是按照广度优先,下面已python3中的一段代码验证新式类的广度优先,示例代码如下:
1 class A(object): 2 def test(self): 3 print('from A') 4 5 6 class B(A): 7 def test(self): 8 print('from B') 9 10 11 class C(A): 12 def test(self): 13 print('from C') 14 15 16 class D(B): 17 def test(self): 18 print('from D') 19 20 21 class E(C): 22 def test(self): 23 print('from E') 24 25 26 class F(D, E): 27 def test(self): 28 print('from F') 29 pass 30 31 32 f1 = F() 33 f1.test()
执行所得结果为:from F
把F类下的test函数注释,执行结果为:from D
把D类下的test函数注释,执行结果为:from B
把B类下的test函数注释,执行结果为:from E
把E类下的test函数注释,执行结果为:from C
把C类下的test函数注释,执行结果为:from A
所以查找顺序为F---D----B-----E-----C------A
与Print(F.mro())的结果[<class '__main__.F'>, <class '__main__.D'>, <class '__main__.B'>, <class '__main__.E'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>] 一致
只有新式类才有mro方法