2017-09-27 3 views
1

私はhttps://www.python-course.eu/python3_multiple_inheritance.phpからこれを持っている:この例で "m of A called"が2回印刷されないのはなぜですか?

class A: 
    def m(self): 
     print("m of A called") 

class B(A): 
    def m(self): 
     print("m of B called") 
     super().m() 

class C(A): 
    def m(self): 
     print("m of C called") 
     super().m() 

class D(B, C): 
    def m(self): 
     print("m of D called") 
     super().m() 

そして出力:

>>> from super5 import D 
>>> x = D() 
>>> x.m() 
m of D called 
m of B called 
m of C called 
m of A called 

私はプログラミングの初心者だと私はどのようにスーパー(理解するのに苦労しています)とMROの作品。申し訳ありませんが、これは愚かな質問です。

+2

MRO内のすべての実装が一度呼び出されるようにするために、これは 'super'が* for *であるためです。 – jonrsharpe

答えて

1

superメソッドの解決順序に従うようにしてください。したがって、すべてのクラスに(適切な)superが含まれている場合は、元々メソッドを呼び出すクラスのMROに従います。

あなたのケースでは、それはDのインスタンスだとDのMROは、次のとおりです。

>>> D.mro() 
[D, B, C, A, object] 

だから、最初のターンでスーパーを使用していますC.mあるスーパーを呼び出すB.mに行くスーパーを呼び出すD.mを使用します。その後A.mが呼び出されます。しかし、ここではAsuperを使用しないため停止しますので、object.mを呼び出そうとしません。

AはMROに2回存在しません(それが可能であれば確信がありません).2回呼び出されるとは限りません。少なくともsuper秒を使用するだけではありません。

MROの作成方法が不明な場合は、official documentationがあります。要約すると、親が呼び出される前に兄弟(同じ親を持つ子クラス)が呼び出されますが、親に複数の子があるという理由だけで複数回呼び出されるわけではありません。

関連する問題