bugfix> python > 投稿
class parent:
    def __init__(self):
        self.a=2
        self.b=4
    def form1(self): 
        print("calling parent from1")
        print('p',self.a+self.b)
 
class child1(parent):
    def __init__(self):
        self.a=50
        self.b=4
    def form1(self):
        print('bye',self.a-self.b)
    def callchildform1(self):
        print("calling parent from child1")
        super().form1()
 
class child2(parent):
    def __init__(self):
        self.a=3
        self.b=4
    def form1(self):
        print('hi',self.a*self.b)
    def callchildform1(self):
        print("calling parent from child2")
        super().form1()
 
class grandchild(child1,child2):
    def __init__(self):
        self.a=10
        self.b=4
    def callingparent(self):
        super().form1()
 
g=grandchild()
g.callchildform1()

上記のコードでは、私が呼び出すとき g.callchildform1() 、MRO規則に従って、メソッドは最初に同じクラスで検索され、次に最初の親(ここではchild1)、次に2番目の親(child2)が検索されます。 予想通り、 child1.callchildform1() そして最初の行を実行します print("calling parent from child1") 。でもこの後、次の行は super().form1() を呼び出す実行されます parent.form1() しかし、これは起こりません。代わりに、 child2.form1() 呼ばれています。なぜこれが起こるのか説明してください。

回答 1 件
  • ドキュメントには、その方法についての優れた説明があります super() 作品:

    super([type[, object-or-type]])

    メソッド呼び出しをに委任するプロキシオブジェクトを返します親または兄弟タイプのクラス。これは、クラスでオーバーライドされた継承されたメソッドにアクセスする場合に役立ちます。

    ザ・ object-or-type を決定しますメソッド解決順序検索されます。検索はクラスから始まります直後のタイプ。

    For example, if __mro__object-or-type です D -> B -> C -> A -> object タイプの値は B 、その後 super() 検索 C -> A -> object

    super() 式と同等です super(__class__, self) どこ __class__ そのメソッド内のクラスオブジェクトは super() と呼ばれます。例えば、 super() 以内に grandchild.callingparent(self) 本質的に super(grandchild, self) 。そして super() 内部 child1.callchildform1(self) 機能は super(child1, self)

    MRO ために grandchild です (<grandchild>, <child1>, <child2>, <parent>, <object>) 。したがって、上記のドキュメントからの抜粋によると、 super().form1() で呼ばれます child1.callchildform1() 、これは super(child1, self) 、の検索 form1 方法直後のクラスから始まります child1 の中に MRO シーケンスと最初に一致するクラス form1 方法は child2

    これは、ダイヤモンド継承構造とMROの基礎となる原則を使用しているために発生します。

    with multiple inheritance hierarchies, the construction of the linearization is more cumbersome, since it is more difficult to construct a linearization that respectslocal precedence orderingandmonotonicity.

    このような階層を設計するときは、次のアプローチに従う必要があります。協調継承、このすでに古典的な記事で説明を見つけることができます。

あなたの答え