2017-11-24 21 views
0

私はスクールプロジェクトの継承階層を作成する必要があります。スクエアが実際には2人の親を必要としないような特定の冗長性を無視して、私は奇妙な方法Pythonはスーパーコールを処理します。複数の継承と複数レベルの継承

次のコードで正方形を初期化するときは、superを呼び出して、Rectangleの初期化メソッドを実行します。意味あり。矩形はスーパーを呼び出し、パラレルグラムの初期化メソッドに進む必要があります。しかし、いくつかのデバッグの後、私はそれがスーパーコールを作るときに、実際にRhombusの初期化メソッドを呼び出すことがわかりました。誰かがここで起こっていることを説明し、可能であればクラス名を明示的に使用せずにこれを適切に実装する方法を説明できますか?

以下に関連コードを示します。

class Parallelogram: 
    def __init__(self, base, side, theta): 
     self.base = base 
     self.side = side 
     self.theta = theta 

class Rectangle(Parallelogram): 
    def __init__(self, base, side): 
     super(Rectangle, self).__init__(base, side, 90) 

class Rhombus(Parallelogram): 
    def __init__(self, side, theta): 
     super(Rhombus, self).__init__(side, side, theta) 

class Square(Rectangle, Rhombus): 
    def __init__(self, side): 
     super(Square, self).__init__(side, side) 
+0

のMROを通して、あなたの相続の実行順序を確認することができますがメソッド解決順序にの –

+2

が重複する可能性を知っていますか[Pythonのスーパーは、()で動作しない方法多重継承?](https://stackoverflow.com/questions/3277367/how-does-pythons-super-work-with-multiple-inheritance) –

+0

これはpython-3.xでタグ付けされていますが、super()は引数なしで実行されます。推奨される読書:[Pythonのsuper()super super!](https://rhettinger.wordpress.com/2011/05/26/super-considered-super/) –

答えて

0

あなたはあなたの呼び出し元のクラスオブジェクト

In [257]: Square.__mro__ 
Out[257]: 
(__main__.Square, 
__main__.Rectangle, 
__main__.Rhombus, 
__main__.Parallelogram, 
object) 
+0

これはなぜ起こっているのか分かりました。しかし、それが期待どおりに動作するように、防止する最善の方法は何でしょうか?私はParallelogram .__ init __()を明示的に呼び出すことに頼らなければならないのでしょうか?それとも、まだsuper()を動作させることができるのでしょうか? – Kraton9000

+0

継承のためにsuperを使用し、達成したいものに対してはsuper.functionを使用しなければなりません。これはinitで書かれたものを達成したい、あるいはそのクラスで書かれた関数を呼び出すことができます –