python-类-继承问题

python 中类分为新式类和经典类。类继承object就是新式类。在python3中类默认都会继承object类,在python2中默认不会继承object类

查找顺序

  • 经典类
    从左到右,深度优先
  • 新式类
    广度优先

我们现在基本都是使用的新式类,所以这里就选择新式类查看继承顺序

新式类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# -*- coding:utf-8 -*-
class A(object):
def go(self):
print "go A go!"
def stop(self):
print "stop A stop!"
def pause(self):
raise Exception("Not Implemented")
class B(A):
def go(self):
super(B, self).go()
print "go B go!"
class C(A):
def go(self):
super(C, self).go()
print "go C go!"
def stop(self):
super(C, self).stop()
print "stop C stop!"
class D(B,C):
def go(self):
super(D, self).go()
print "go D go!"
def stop(self):
super(D, self).stop()
print "stop D stop!"
def pause(self):
print "wait D wait!"
class E(B,C): pass
a.go()
b.go()
c.go()
d.go()
e.go()

输出如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# a.go()
go A go!
# b.go()
# 通过super执行父类的go方法,然后再执行b中super后面的方法体
go A go!
go B go!
# c.go()
go A go!
go C go!
# d.go()
# B --> C --> A --> D
# 因为先继承的B,后继承的C,会先进入B中go方法,因为B和C同时继承A,会从B中go方法super出返回到 C,
# 在C中go方法通过super调用到A,执行完A中go方法后返回C,执行C中go方法的print,完成后会返回到B,
# 执行B中go方法的print,然后返回到D,最后执行D中go方法的print
go A go!
go C go!
go B go!
go D go!
# e.go()
# 因为E没有任何方法,所以先到B的go方法,在到super的时候,会返回到C,并进入C中go方法,
# 然后通过C中的super进入A中go方法,然后返回C,执行完print,再返回B,执行print,然后返回退出
go A go!
go C go!
go B go!
a.stop()
# stop A stop!
b.stop()
# stop A stop!
c.stop()
# stop A stop!
# stop C stop!
d.stop()
# stop A stop!
# stop C stop!
# stop D stop!
e.stop()
# stop A stop!
a.pause()
# ... Exception: Not Implemented
b.pause()
# ... Exception: Not Implemented
c.pause()
# ... Exception: Not Implemented
d.pause()
# wait D wait!
e.pause()
# ...Exception: Not Implemented