2015-09-22 12 views
5

私はA、B、Cの3つのクラスを持っているとしましょう。AはBの基本クラスで、BはCです。階層は通常ここに保持されますが、1つのメソッドでは異なるはずです。だから、基本的には次のように動作するはずPythonあるクラスから継承しますが、別のクラスを呼び出すメソッドをオーバーライドしますか?

class A(object): 
    def m(self): 
     print 'a' 

class B(A): 
    def m(self): 
     super(B, self).m() 
     print 'b' 

class C(B): 
    def m(self): 
     super(A, self).m() 
     print 'c' 

a = A() 
a.m() 
a 

b = B() 
b.m() 
a 
b 

c = C() 
c.m() 
a 
c 

しかし、それはするつもりはない、それは次のように例えばA.

から継承されたようにCクラスの場合、それは行動しなければなりません

私はこのクラスを解決するために、私はクラスから継承することができます私はBからのすべてを継承し、その特定のメソッドのためにmは基本クラスAのためにsuperを呼び出します。私はそのメソッドが1つの例外であることを意味します。それともクラスCのためにどういうふうに呼び出すべきですか?

どうすればいいですか?

+1

'super 'を使う代わりに' A.m(self) 'を試しましたか? –

+0

@MathiasEttingerいいえ私はしませんでしたが、今は試してみました。ありがとう。あなたは答えとして投稿することができます。それは私の問題を解決するために – Andrius

+0

、A.m()はクラスメソッドでなければなりません – fixmycode

答えて

4

super呼び出しを使用すると、pythonはクラスのMROを検査して、必要な関数を呼び出すときにどのクラスを使用するかを決定します。

あなたは短絡この動作にしたいので、あなたは明示的にあなたとのメソッドを使用したいクラスを述べることができる:

class C(B): 
    def m(self): 
     A.m(self) 
     print 'c' 
8

これを解決するには2つの方法が実際にあります:あなたはショートカットすることができますsuper()に電話して、完全にマティアス・エッティンガーの答えのようにMROをバイパス、またはあなただけの正しいコールsuper()に発行できます。

class C(B): 
    def m(self): 
     super(B, self).m() 
     print 'c' 

がことを覚えておいてくださいは、最初の引数として、mroをルックアップするクラスを期待しています。これは通常呼び出しが行われるクラスですが、必要に応じてmroの別のクラスupperを渡すことができます。

関連する問題