2016-05-19 5 views
2

私は例を持っています。私には2つのクラスがあります。 ABのスーパークラスです。スーパークラスのスーパークラスからメソッドを呼び出す

class A(object): 
    def p(self): 
     print "a" 


class B(A): 
    def p(self): 
     print "b" 
     super(A, self).p() 

私は新しいクラスCを持っています。クラスCBの子クラスであり、そのように、再び方法pを上書きする必要があります。私は、メソッドクラスCスーパーBp()を上書きし、方法p()を呼び出すことができますどのように

class C(B): 
    def p(self): 
     print "c" 
     # here call the method p of the 'supersuper'class A 
     # without calling the method p of the superclass B 
    ... 

スーパークラスAスーパークラスのメソッドpを呼び出さずにB?誰かにアイデアはありますか?

P/S:メソッド名は同一でなければなりません。

+1

これはPythonです。私たちは皆ここで大人に同意しているので、 'Ap(self)'や 'self .__ mro__'を手動で実行することができます。しかし、あなたの要件はいくつかの基本継承ルールを破ります。それはうまくサポートされません。 –

+0

はい、私は知っている、それは良いではありません。しかし、私は編集せずに彼のメソッドを変更するクラスを継承する必要があります。 – qvpham

答えて

5

A.p(self)と直接電話すると、これはsuper()がサポートするように設計されたものではありません。 A.p()で、の方法であるため、手動でselfを渡す必要があります。

しかし、あなたのクラスデザインを再考したいと思います。おそらくヘルパーメソッドを導入したいと思うかもしれません。これらのうちの1つをA.p()C.p()から呼び出すことはできますが、B.p()ではできません。そうすれば、B.p()super().p()にすべてを使用する必要はなく、単にこれらのヘルパーメソッドを再利用するだけです。

+0

私たちは先日仕事で同様の問題を抱えていました。悪いクラスのデザインが原因ですが、私たちはスプリントを通過するためにこのようなことをすることを考えていました。複数の継承を使用していない限り、 'C 'の中で' super(B、self).p() 'のようなことをした場合、何が壊れる可能性がありますか? –

+2

@ Two-BitAlchemist: 'A'は常に階層の次のクラスであるため、何も壊れません。どこかで複数の継承を使って、 'A'や' B'でミックスすることは決してありません。しかし明示的には暗黙的にここより優れています。一年のうちに 'super(B、self)'が 'A 'で検索を開始することを覚えていますか? –

+0

あなたの答えに基づいて私のプログラムを作りました。それは今働きます。ありがとうMartijn – qvpham

関連する問題