python 之 多继承的顺序

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调用foo()时,搜索顺序是 D => C1 => P1

实例d调用bar()时,搜索顺序是 D => C1 => P1 => P2

换句话说,经典类的搜索方式是按照“从左至右,深度优先”的方式去查找属性。d先查找自身是否有foo方法,没有则查找最近的父类C1里是否有该方法,如果没有则继续向上查找,直到在P1中找到该方法,查找结束。


2. 新式类
    d=D() 
    d.foo()  # 输出 p1-foo 
    d.bar()  # 输出 c2-bar 

实例d调用foo()时,搜索顺序是 D => C1 => C2 => P1

实例d调用bar()时,搜索顺序是 D => C1 => C2

可以看出,新式类的搜索方式是采用“广度优先”的方式去查找属性。

猜你喜欢

转载自blog.csdn.net/ll641058431/article/details/80173660