2011-10-28 47 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() 

理想輸出:

Class B processes. 

谷歌搜索並沒有真正返回有關基於Python的接口編程頁,儘管它應該在的Java等。由於是共同的!

+2

這是** **多態性,而不是接口。 –

+1

如果你想要做多態性,你爲什麼要用'@ staticmethod'? –

+0

@Brendan非常感謝。我更新了代碼並希望它看起來更好。我是Java程序員,對Python仍然很陌生。 – IsaacS

回答

2

拋開風格的問題,使用classmethod而不是staticmethod。它通過正在使用的課程。

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

這個問題是關於多態的,而不是嚴格的繼承。 –