2011-10-28 4 views
-1

スーパークラスのPythonで、そのサブクラスでオーバーライドされている関数をどのように呼び出すことができますか?Pythonでのインターフェイスベースのプログラミング?

class A: 
    @staticmethod 
    def interfaceBasedMethod(): 
     print "Want to delegate to overriding method in subclass" 

    @staticmethod 
    def a(): 
     interfaceBasedMethod() # <-- I know this causes error. But here 
           # I want to call the overridden method in subclass. 

class B(A): 
    @staticmethod 
    def interfaceBasedMethod(): 
     print "Class B processes." 

if __name__ == "__main__": 
    b=B 
    b.a() 

理想的な出力:それはJava等に共通する必要がありますが、

Class B processes. 

Google検索は、本当に感謝、Pythonでインターフェイスベースのプログラミングについてのページを返しません!

+2

これは**多型**、ではないのインタフェースです。 –

+1

多態性を行おうとしているのなら、なぜあなたは '@ staticmethod'を使用していますか? –

+0

@ブレンダン長い感謝。私はコードを更新し、それがより良く見えるように願っています。私はJavaプログラマーであり、まだPythonには初めてです。 – IsaacS

答えて

2

スタイルの質問を除いて、staticmethodではなくclassmethodを使用してください。それは使用されているクラスを通過します。

class A: 
    @classmethod 
    def interfaceBasedMethod(cls): 
     print "Want to delegate to overriding method in subclass" 

    @classmethod 
    def a(cls): 
     cls.interfaceBasedMethod() 

class B(A): 
    @classmethod 
    def interfaceBasedMethod(cls): 
     print "Class B processes." 

if __name__ == "__main__": 
    b=B 
    b.a() 
1

hereの前に相続に関する質問が回答されました。

要するに、Pythonは関数super(type[, instance])を提供します。

文書化here、superは、サブクラス内からスーパークラスメソッドにアクセスするためのきれいな方法を提供します。 Thisページでは、super()ユースケースの網羅的な調査を提供していますが、これはランダウンです。

ビットを一般化することができ
class C(B): 
    def method(self, arg): 
     super(C, self).method(arg) 

....

class C(B): 
    def method(self, arg): 
     super(self.__class__, self).method(arg) 
+0

この質問は厳密には継承ではなく多形性に関するものです。 –

関連する問題