2016-12-10 5 views
0
class GrandParent(): 
    def __init__(self, a, b): 
     self._a = a 
     self._b = b 

    def blah(self): 
     return "GP:" + self._a + self._b 

class Parent2(GrandParent): 
    def __init__(self, a, b, c): 
     self._a = b 
     self._b = a 
     self._c = self.blah() 

class Child2(Parent2): 
    def __init__(self, a, b, c, d):  
     Parent2.__init__(self, a, b, c) 

    def blah(self): 
     return ("C2: " + self._a + self._b 
     + self._c + self._d) 


c2 = Child2("A", "B", "C", "D") 

ここに私が追跡するはずのコードです。私はオブジェクトc2Child2を作成します。私はChild2.__init__に入る。私はParent2.__init__に入る。 self._aself._bを初期化します。Python OOPトレース小さな混乱

私の問題はself._cです。

Parent2blah()メソッドを持っていないので、私はそれがGrandParent.blah()からself._cを得ることを期待するが、代わりにそれはChild2.blah()に行きます。なぜこれが起こるのですか?

+0

あなたの例では、 'Child2'は' Parent2'のサブクラスである必要があります(現在 'Parent1'と言います)。私はそれを修正するには編集が小さすぎます。 –

+0

@ P-robotが完了したので、編集が十分に大きくなるようにいくつかの改良が加えられました。 –

+0

実際、これはもっと大きなもののコードスニペット部分ですが、Parent1は要素を再生しませんでしたし、Child1のようなクラスもありませんでした。そのため、私の問題に関係しないので削除しました。 –

答えて

1

selfChild2の直接インスタンスなので、self.blah()Child2.blah(self)と等価である必要があります。そのコードは、その呼び出しが関連しない直前に、Child2の親のメソッドに存在することになります。

+0

Ohhhh ....しかし、そのChild2はああ、それは親と呼ぶでしょうか? –

+0

はい。具体的には、 'Child2 .__ mro__'(メソッド解決の順序)を調べ、そのメソッドを持つ最初のものを選びます。 –