Python----面向对象--继承的实现原理

一、面向对象中的类有两种,新式类和经典类

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方法

原文地址:https://www.cnblogs.com/xudachen/p/8597501.html