私はスクールプロジェクトの継承階層を作成する必要があります。スクエアが実際には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)
のMROを通して、あなたの相続の実行順序を確認することができますがメソッド解決順序にの –
が重複する可能性を知っていますか[Pythonのスーパーは、()で動作しない方法多重継承?](https://stackoverflow.com/questions/3277367/how-does-pythons-super-work-with-multiple-inheritance) –
これはpython-3.xでタグ付けされていますが、super()は引数なしで実行されます。推奨される読書:[Pythonのsuper()super super!](https://rhettinger.wordpress.com/2011/05/26/super-considered-super/) –