python 支持多继承,但对与经典类和新式类来说,多继承查找的顺序是不一样的。
经典类: | 新式类 |
class P1: def foo(self): print ('p1-foo') class P2 : def foo(self): print ('p2-foo') def bar(self): print ('p2-bar') class C1 (P1,P2): pass class C2 (P1,P2): def bar(self): print ('C2-bar') class D(C1,C2): pass |
class P1(object): def foo(self): print ('p1-foo') class P2(object): def foo(self): print ('p2-foo') def bar(self): print ('p2-bar') class C1 (P1,P2): pass class C2 (P1,P2): def bar(self): print ('C2-bar') class D(C1,C2): pass |
1. 经典类
d = D()
d.foo() # 输出 p1-foo
d.bar() # 输出 p2-bar
d.bar() # 输出 p2-bar
实例d调用foo()时,搜索顺序是 D => C1 => P1
实例d调用bar()时,搜索顺序是 D => C1 => P1 => P2
可以看出,经典类的搜索方式“从左至右,深度优先”。d先查找自身是否有foo方法,没有则查找最近的父类C1里是否有该方法,如果没有则继续向上查找,直到在祖先类中找到该方法,查找结束。
2. 新式类
d=D()
d.foo() # 输出 p1-foo
d.bar() # 输出 c2-bar
d.foo() # 输出 p1-foo
d.bar() # 输出 c2-bar
实例d调用foo()时,搜索顺序是 D => C1 => C2 => P1
实例d调用bar()时,搜索顺序是 D => C1 => C2
可以看出,新式类的搜索方式“广度优先”。
参考:
http://www.cnblogs.com/linyawen/archive/2012/04/25/2469538.html