Python--多继承
程序员文章站
2022-07-15 16:58:59
...
class F:
def func(self):
print('F')
class A(F):
def func(self):
print('A')
pass
class B(A):
def func(self):
print('B')
pass
class E(F):
def func(self):
print('F')
class C(E):
def func(self):
print('C')
pass
class D(B, C):
def func(self):
print('D')
pass
d = D()
d.func()
以上问题,简化如下
^ F 5
| / \
#深度优先 | 2 A E 4
| | |
| 1 B C 3
| \ /
| D
—————————————————————————> 广度优先
在多继承中 从左到右继承, 如果B找不到,就会找A,如果A也找不到,则会找C,C找不到就会找E,E再找不到才是F
钻石继承 广度优先 Python3的新式类都是广度优先
在Python2中 经典类 深度优先
super的本质
print(D.mro())
多继承当中,我们子类的对象调用一个方法,默认就是就近原则
经典类中 深度优先
新式类 广度优先
Python2.7 新式类和经典类共存,新式类要继承object
Python3 只有新式类 默认继承object
经典类 和新式类还有一个区别 mro 方法只在新式类中存在
super 只在Python3中存在
class A(object):
def func(self):
print(‘A’)
class B(A):
def func(self):
super().func()
print('B')
class C(A):
def func(self):
super().func()
print('C')
class D(B, C):
def func(self):
super().func()
print('D')
d = D()
d.func()
A
/ \
B C
\ /
D
答案: A C B D
*****super的本质 : 不是直接 找父类 而是根据调用者的节点位置的广度优先顺序来的