python(第六天):MRO和super

代码如下:

 

[python] view plain copy
 
  1. class A(object):  
  2.     def __init__(self):  
  3.         print('A')  
  4.         super(A, self).__init__()  
  5.   
  6. class B(object):  
  7.     def __init__(self):  
  8.         print('B')  
  9.         super(B, self).__init__()  
  10. class C(A,B):  
  11.     def __init__(self):  
  12.         print('C')  
  13.         A.__init__(self)   
  14.         B.__init__(self)  
  15.   
  16. print('MRO:',[x.__name__ for x in C.__mro__])  
  17.   
  18. C()  

输出结果为:

 

 

[python] view plain copy
 
  1. MRO: ['C', 'A', 'B', 'object']  
  2. C  
  3. A  
  4. B  
  5. B  

起初以为当调用A的构造时 是由object再回来调用B的构造.顺序为 C--A--object--B .然后调用B.__init__(self) 显示出B.所以会出现CAAB.

 

 

修改了C的代码后:

 

[python] view plain copy
 
  1. class C(A,B):  
  2.     def __init__(self):  
  3.         print('C')  
  4.  ##       A.__init__(self)   
  5.         B.__init__(self)  

输出结果为:

 

 

[python] view plain copy
 
  1. MRO: ['C', 'A', 'B', 'object']  
  2. C  
  3. B  

 

 

发现之前得出的结论有问题,因为按照之前得出的结论结果应该为:CBA, 可是没有了A.

经过仔细思考后认为B的构造是由A直接调用的,而且跟C的继承顺序有关.也就是C--A--B--Object, 其中A--B是由C(A,B)决定的.

 

[python] view plain copy
 
  1. class A(object):  
  2.     def __init__(self):  
  3.         print('A')  
  4.         super(A, self).__init__()  
  5.   
  6. class B(object):  
  7.     def __init__(self):  
  8.         print('B')  
  9.         super(B, self).__init__()  
  10. class C(B,A):  
  11.     def __init__(self):  
  12.         print('C')  
  13. #        A.__init__(self)   
  14.         B.__init__(self)  
  15.   
  16. print('MRO:',[x.__name__ for x in C.__mro__])  
  17.   
  18. C()  
  19.         


输出结果如下:

 

 

[python] view plain copy
 
  1. MRO: ['C', 'B', 'A', 'object']  
  2. C  
  3. B  
  4. A  



 

可以看到跟我的想法是一样的

posted @ 2017-07-31 13:50  天涯海角路  阅读(105)  评论(0)    收藏  举报